A题Painting the Ribbon题解
其实这是一个经典的数学思维题 ,飘带有N段,每段可以着色,有M种颜色可以选择,另一个人有K次修改颜色的机会,问有没有方式使得飘带在K次修改后都无法变为单一颜色 ?
其实最简单的方法就是1–M颜色以此涂色,这样子各种颜色出现的又多又均衡 ,那么另一个人只能选择最多的一种颜色作为最终颜色,其他颜色全部修改。经过计算可以知道最多的那种颜色会有
N/M向上取整个,所以需要N- 向上取整(N/M)次机会才能变为单一颜色
#include<bits/stdc++.h>
using namespace std;
int main() {int a;cin>>a;for(int i=1;i<=a;i++){int n,m,k;int d=1;int s=0;cin>>n>>m>>k;d=n-(n/m);if(n%m!=0){d--;}if(d<=k){cout<<"NO";}else{cout<<"YES";}cout<<endl;}return 0;
}
B - Special Characters
简单题,按题目意思构造即可
#include<bits/stdc++.h>
using namespace std;
int main() {int a;cin>>a;for(int i=1;i<=a;i++){int b;cin>>b;int c=0;if(b%2==1){cout<<"NO"<<endl;}else{cout<<"YES"<<endl;while(c!=b/2){if(c%2==1){cout<<"BB";}else{cout<<"AA";}c++;}cout<<endl;}}return 0;
}
C题题解
注意一开始给我们的就是美丽的数组,说明它能够最终变为一样的
我们根据题目的规则来思考,能变成最终一样的,一定能得到首元素跟末尾元素是相同的结论
因此我们的删除方式可以有以下方法:
1 删除开头一段连续的A[1]长度
2 删除末尾一段连续的A[1]长度
3 寻找两个不等于A1的值,删除他们中间的所有数字
以上三种方式都可以让数组变得不美丽 求最短即可
#include<bits/stdc++.h>
using namespace std;
int A[300010];
int main() {int a;cin>>a;for(int i=1;i<=a;i++){int b;cin>>b;int len=0;int x=1e9;for(int j=1;j<=b;j++){cin>>A[j];if(A[j]==A[1]){len++;}else{x=min(x,len);len=0;}}x=min(x,len);if(x==b){cout<<"-1"<<endl;}else{cout<<x<<endl;}}return 0;
}
D题题解
每个数字其实要么拆,要么不拆
我们考虑倒着处理,先把A[n]存进去,不拆,因为A[n]是最后一个元素,不拆它相当于后方有个较大的。对于每个数字,如果A[i]< 上一次存的数,那么我们不拆直接放进去,否则就正常拆掉,最终检查是不是按顺序来的
#include<bits/stdc++.h>
using namespace std;
int A[100];
int B[1000];
int main() {int a;cin>>a;for(int i=1;i<=a;i++){int b;cin>>b;for(int j=1;j<=b;j++){cin>>A[j];}int len=0;B[++len]=A[b];for(int j=b-1;j>=1;j--){if(A[j]<=B[len]){B[++len]=A[j];}else{B[++len]=A[j]%10;B[++len]=A[j]/10%10;}}int c;bool ok=true;for(int j=2;j<=len;j++){c=B[j-1];if(c<B[j]){cout<<"NO"<<endl;ok=false;break;}}if(ok==true){cout<<"YES"<<endl;}}return 0;
}
E题题解
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+5;
char a[N],b[N];
int T;
int main(){cin>>T;while(T--){cin>>a>>b;int lena=strlen(a);int lenb=strlen(b);int op=0;for( int i=0;i<lena;i++ ){if(op==0){if(a[i]<b[i]) swap(a[i],b[i]);if(a[i]>b[i]) op=1;}else if(op==1){if(a[i]>b[i]) swap(a[i],b[i]);}}cout<<a<<'\n'<<b<<'\n';}return 0;
}
F题题解
模拟题,按题目意思写就行了 控制好坐标位置
#include<bits/stdc++.h>
using namespace std;
int n;char s[2][200010];
void Main(){cin>>n;scanf("%s%s",s[0]+1,s[1]+1);int f=0;for(int i=2;i<=n;i+=2)if(s[0][i]=='<'&&(s[1][i-1]=='<'||i<n-1&&s[1][i+1]=='<')){f=1;break;}if(f)cout<<"NO\n";else cout<<"YES\n";
}signed main(){int T;cin>>T;while(T--)Main();return 0;
}