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;
}