Educational Codeforces Round 67 (Rated for Div. 2)·

A - Stickers and Toys

题目大意就是有n个鸡蛋,然后有s个彩带(吧?忘记了)和t个玩具,问至少要拿几次鸡蛋才有可能拿到一个彩带和一个鸡蛋。
就是可以分成三部分来算,就是a表示只有彩带的鸡蛋,b表示只有玩具的鸡蛋,c表示既有彩带又有玩具的鸡蛋。然后在a,b中取最大然后再+1就可以。

     # include <bits/stdc++.h>
     using namespace std;
     
     int main()
     {
         int T;
         scanf("%d",&T);
         while(T--){
            int n,s,t;
            int a=0,b=0,c=0;
            int cnt=0;
            scanf("%d %d %d",&n,&s,&t);
            c=s+t-n;
            a=s-c;
            b=t-c;
            cnt=max(a,b)+1;
            printf("%d\n",cnt);
         }
     
         return 0;
     }

B - Letters Shop

题目大意就是有一个字符串,然后有m个不完整子字符串,然后问这个不完整的子字符串,一共需要多少个才会完整(好吧╮(╯-╰)╭,感觉没有解释清楚)。
解法就是,计算当前子字符串中在原字符串的顺序中排最后一个的字母的次序。
先搞一个二维数组,然后把每个字母的次序记录下来。对于每一个子字符串来说,用一个数组表示每一个字母当前的次序,然后在二维数组里面寻找就可以。

# include <bits/stdc++.h>
using namespace std;

const int MAXN=2e5+10;
int a[30][MAXN];
int mm[30];
int nn[30];
int main()
{
    int n;
    scanf("%d",&n);
    string s;
    cin>>s;
    for(int i=0;i<n;i++){
        a[s[i]-'a'][mm[s[i]-'a']++]=i+1;
    }
    int m;
    scanf("%d",&m);
    for(int i=0;i<m;i++){
        string s1;
        cin>>s1;
        memset(nn,0,sizeof(nn));
        int  maxx=0;
        for(int j=0;j<s1.length();j++){
            maxx=max(a[s1[j]-'a'][nn[s1[j]-'a']++],maxx);
        }
        printf("%d\n",maxx);
    }

    return 0;
}

C - Vasya And Array

【题意】就是要求找出一个序列的顺序是和要求的一样的序列即可
【解法】首先根据要求,把要求分成两部分,一部分是要求不降序的,一部分是不按不照降序的(不按照不降序就是不按照升序和平序,并不是说就是降序)(死活wa了好多次才明白介个)。首先满足不降序,就是用一个数组标记哪些区间是不不降序的,然后再满足不按照降序的,就是检查该区间是否都是平序和升序,最后再根据递推求出这个序列就可以了

# include <bits/stdc++.h>
using namespace std;

int a[1100];
int b[1100];
int t[1100];
int l[1100];
int r[1100];
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d %d %d",&t[i],&l[i],&r[i]);
        if(t[i]==1){
            for(int j=l[i];j<r[i];j++){
                b[j]=1;
            }
        }
    }
    for(int i=1;i<=m;i++){
        int flag=0;
        if(t[i]==0){
            for(int j=l[i];j<r[i];j++){
                if(b[j]==0){
                    flag=1;
                }
            }
            if(flag==0){
                printf("NO");
                return 0;
            }
        }
    }

 /*   for(int k=1;k<n;k++){
        printf("%d ",b[k]);
    }
    cout<<endl;
 */   a[1]=1100;
    printf("YES\n");
    printf("%d",a[1]);
    for(int i=2;i<=n;i++){
        if(b[i-1]){
            a[i]=a[i-1]+b[i-1];
        }else{
            a[i]=a[i-1]-1;
        }
        printf(" %d",a[i]);
    }
    return 0;
}

posted @ 2022-02-27 00:02  fengzlj  阅读(21)  评论(0)    收藏  举报