A、B太简单了就不写了。
C:
参考:https://blog.csdn.net/qq_34261446/article/details/104187845
思路:
这段子串的前后两个位置的状态是一样的,因为L和R的数量相等U和D的数量也相等。
pair<first,second>
map<key,value>
用一个map<pair<int , int> , int> vis; key中的pair表示当前状态,value来记录当前位置。
map头文件要用到#include <map>
pair头文件要用到#include
map等价一个关联数组,key值唯一,可用[key]找value</map>
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while(t--){
int n;
string s;
cin >> n >> s;
map<pair<int , int> , int> vis;
pair<int , int> cur(0,0);
vis[cur] = 0;
int l = - 1;
int r = n;
for(int i = 0; i < n; i ++){
if(s[i] == 'L') cur.first ++;
if(s[i] == 'R') cur.first --;
if(s[i] == 'U') cur.second ++;
if(s[i] == 'D') cur.second --;
if(vis.count(cur)){
if(i - vis[cur] + 1 < r - l + 1){
l = vis[cur];
r = i;
}
}
vis[cur] = i + 1;
}
if(l == -1)
cout << -1 << endl;
else
cout << l + 1 << " " << r+1 <<endl;
}
return 0;
}
D
贪心
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN = 2e5 + 5;
int a[MAXN];
int b[MAXN];
int c[MAXN];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n, A, B, k, ans=0, cnt = 1;
cin >> n >> A >> B >> k;
for(int i = 1; i <= n; i++){
cin >> a[i];
a[i] = (a[i] - 1) % (A + B) + 1;
if(a[i] <= A) ans++;
else c[cnt] = ((a[i] + A - 1) / A) - 1, cnt++;
}
sort(c + 1, c + cnt);
for(int i = 1; i < cnt; i++){
if(k < c[i]) break;
k -= c[i];
ans++;
}
cout << ans << endl;
return 0;
}