Codeforces Round #706 (Div. 2) (A~B)
第一次参加cf。。
只过了前两题呜呜
以通过system test
以通过system test
先贴一下代码
思路明天再贴吧。学习去了orz
A. Split it!
本题就是判断回文字符串。且有一个ak+1能够暂时摆脱回文限制。
故只要令前面和后面相同的字符数大于等于k即yes。
#include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<vector> #define MAXN 105 using namespace std; typedef pair<int,int> pii; typedef long long ll; char s[MAXN]; int t,n,k; int judge(char s[],int len){ int cnt=0; for(int i=0;i<len/2;i++) if(s[i]!=s[len-1-i]){ return cnt; }else cnt++; if((len&1)==0) cnt--; return cnt; } int main(){ scanf("%d",&t); while(t--){ scanf("%d%d",&n,&k); scanf("%s",s); if(k==0){ printf("YES\n"); continue; } int len=strlen(s); if(k*2+1>len||len==2){ printf("NO\n"); continue; } int cnt=judge(s,len); if(cnt==0) printf("NO\n"); else if(cnt<k) printf("NO\n"); else printf("YES\n"); } }
用set结构(内部会自动从小到大排序)
如果0~n每个数都在set中,则下一个加入的必定是n+1.故直接跳出循环,令计数加上剩余次数即可。
如果0~n有些数不在。则判断新加入的数是否在set中。如果已经在了则mex和max都不会改变。break即可。
如果新加入的数不在set中,则加入set,重新判断。
#include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<vector> #include<set> #define MAXN 100005 using namespace std; typedef pair<int,int> pii; typedef long long ll; int t,n,k; set<int>s; int main(){ scanf("%d",&t); while(t--){ s.clear(); scanf("%d%d",&n,&k); for(int i=0;i<n;i++){ int temp; scanf("%d",&temp); s.insert(temp); } set<int>::iterator itr1; itr1=s.end(); itr1--; int mexn=0,maxn=*itr1,ddmex=0; itr1=s.begin(); while(k--){ for(itr1;itr1!=s.end();itr1++) if(*itr1==mexn){ mexn++; }else if(mexn<*itr1){ break; } int ans=(mexn+maxn+1)/2; if(s.find(ans)!=s.end()) break; else{ s.insert(ans); if(ans>maxn){ n+=k+1; break; } n++; } } printf("%d\n",n); } }

浙公网安备 33010602011771号