有一个01串a,b,我们可以对a进行两个操作
1.使a2变成min(a1,a2),删除a1
2.使a2变成max(a1,a2),删除a2
问最后能否使a变成b
如果a串的长度大于b串,就看a1是否等于b1,如果相同就把a2变成a1,删除a1,知道两串长度相同,然后判断是否相同
- #include
- using namespace std;
-
-
- int main(){
- int t;
- cin >> t;
- while(t--){
- int n, m;
- cin >> n >> m;
- string s, ss;
- cin >> s >> ss;
- while(n > m){
- if(s[0] == ss[0]){
- s[1] = s[0];
- }
- s.erase(0, 1);
- n--;
- }
- if(s == ss){
- cout << "YES" << endl;
- }else{
- cout << "NO" << endl;
- }
- }
- return 0;
- }
由|v-ai|x可得:vx + ai 以及 vai - x,以此我们可以通过如果前一个算出来的范围大于后一个,那么我们缩小范围即可,如果后一个的范围不在第一个里面,那么我们就要更改一次
- #include
- using namespace std;
-
- int arr[200005];
-
- int main(){
- int t;
- cin >> t;
- while(t--){
- int n, x;
- cin >> n >> x;
- for(int i = 0; i < n; i++){
- cin >> arr[i];
- }
- int maxn = x + arr[0];
- int minn = arr[0] - x;
- int ans = 0;
- for(int i = 1; i < n; i++){
- int a = x + arr[i];
- int b = arr[i] - x;
- if(b > maxn || a < minn){
- ans++;
- maxn = a;
- minn = b;
- }
- if(b >= minn){
- minn = b;
- }
- if(a <= maxn){
- maxn = a;
- }
- }
- cout << ans << endl;
- }
- return 0;
- }
一开始有m个房子被感染,那么就会有m个区间,我们优先选择房子多的区间进行保护,保护一个房子数大于等于3的区间需要两天,大于等于1的需要1天,由此我们可以算出我们最多可以保护的房子数,最后输出总数-保护数即可
- #include
- using namespace std;
- int arr[100005];
- bool cmp(int a, int b){
- return a > b;
- }
- int main(){
- int t;
- cin >> t;
- while(t--){
- int n, m;
- cin >> n >> m;
- for(int i = 1; i <= m; i++){
- cin >> arr[i];
- }
- if(m == 1){
- cout << 2 << endl;
- continue;
- }
- sort(arr + 1, arr + 1 + m);
- vector<int> ve;
- ve.push_back(arr[1] - 1 + n - arr[m]);
- for(int i = 2; i <= m; i++){
- ve.push_back(arr[i] - arr[i - 1] - 1);
- }
- sort(ve.begin(), ve.end(), cmp);
- int a = 0;//其他区间以及感染的房子数
- int ans = 0;
- for(int i = 0; i < ve.size(); i++){
- if(ve[i] - a >= 3){
- ans += ve[i] - a - 1;
- a += 4;
- }else if(ve[i] - a >= 1){
- ans ++;
- a += 2;
- }
- }
- cout << n - ans << endl;
- }
- return 0;
- }