Codeforces Round #706 (Div. 2) (A~B)

第一次参加cf。。
只过了前两题呜呜
以通过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");
    }
} 

 

 

B.Max and Mex
用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);
    }
} 

 

posted @ 2021-03-10 22:16  mikku  阅读(47)  评论(0)    收藏  举报