CF1951

A

link

这个题就是讨论。
首先,如果没有\(1\)就一定可以。
如果有\(1\)
如果长度为\(2\)一定不行。
\(1\)的个数为奇数不行。
如果为偶数
有一个小点:如果是\(2\)\(1\)且连在一起,不行,因为不能开相邻的。

点击查看代码
#include<bits/stdc++.h>

using namespace std;

int t;
int n;
char a[55];

void qwq(){
	
	cin >> n;
	
	int g = 0;
	for(int i = 1;i <= n;++ i){
		cin >> a[i];
		if(a[i] == '1') g++;
	}
	
	if(g == 0) cout << "YES\n";
	else{
		if(n == 2) cout << "NO\n";
		else{
			if(g%2) cout << "NO\n";
			else{
				if(g == 2){
					for(int i = 1;i <= n;++ i){
						if(a[i] == '1'&&
						a[i-1] == '1'){
							cout << "NO\n";
							return;
						}
					}
					cout << "YES\n";
				}
				else cout << "YES\n";
			}
		}
	}
	
}

signed main(){
	
	cin >> t;
	while(t--) qwq();
	
	return 0;
	
} 

B

link

首先,肯定不往后换。
其次,如果它前面有比它大的数,肯定一场也赢不了。
所以,我们要换到它前面第一个比它大的位置,设为\(x\)
还有一种可能,换到\(1\),那么到\(x\)这个位置就会停,但是如果\(1\)~\(x\)\(x\)到下一个大于它的数长度大,就可以选\(1\)

点击查看代码
#include<bits/stdc++.h>

using namespace std;

int t;
int n,k;
int a[100005];
int b[100005];
int qzh[100005];

int qiuzhi(int x){
	swap(a[x],a[k]);
	int ans = 0;
	if(qzh[x-1] < a[x]){
		for(int i = x+1;i <= n;++ i){
			if(a[i] < a[x]) ans++;
			else break;
		}
		if(x != 1) ans++;
	}
	swap(a[x],a[k]);
	return ans;
} 

void qwq(){
	
	cin >> n >> k;
	for(int i = 1;i <= n;++ i){
		cin >> a[i];
		qzh[i] = max(qzh[i-1],a[i]);
		b[i] = a[i];
	}
	
	int w = k;
	for(int i = 1;i < k;++ i)
		if(a[i] > a[k]){
			w = i;
			break;
		}
	
	int ans = qiuzhi(w);
	ans = max(ans,qiuzhi(1));
	
	cout << ans << endl;
	
}

signed main(){
	
	cin >> t;
	while(t--) qwq();
	
	return 0;
	
}
posted @ 2024-04-10 22:28  学贵坚持  阅读(10)  评论(0编辑  收藏  举报