Codeforces Round #424 (Div. 2)A-B-C 日常训练

来源:互联网 发布:漫画创作软件 编辑:程序博客网 时间:2024/05/22 03:16

题目链接:

点击打开链接、

暂时摆这三道,后面补完在贴。


A

简单模拟

#include<stdio.h>#include<string.h>const int maxn=1100;int a[maxn];int num[maxn];int main(){    int n;    int mx=-1;    scanf("%d",&n);    memset(num,0,sizeof(num));    for(int i=0;i<n;i++){        scanf("%d",&a[i]);       // num[a[i]]++;       if(mx<a[i]) mx=a[i];    }    num[0]=1;    for(int i=0;i<n-1;i++){        if(a[i]==a[i+1]) num[i+1]=num[i]+1,num[i]=1;        else num[i+1]=1;    }    /*check num[]*/    /*    for(int i=0;i<n;i++){        printf("%d ",num[i]);    }printf("\n");    */    int number=0;    for(int i=0;i<n;i++){        if(num[i]>1) number++;    }//*bool up=true;    bool ans=true;   if(number>1) printf("NO\n");    else{       for(int i=0;i<n-1;i++){            if(a[i]<a[i+1]&&up){                    //printf("1\n");                    continue;            }else if(a[i]==a[i+1]&&a[i]==mx){                //printf("2\n");                continue;            }else if(a[i]>a[i+1]&&up){               // printf("3\n");                up=false;            }            else if(a[i]>a[i+1]&&!up){                //printf("4\n");                continue;            }            else{               // printf("5\n");                ans=false;                break;            }       }        if(ans) printf("YES\n");        else printf("NO\n");    }//*/    return 0;}

B

#include<stdio.h>#include<ctype.h>#include<string.h>const int maxn=1100;char a[maxn],b[maxn],c[maxn];int main(){    scanf("%s",a);    scanf("%s",b);    scanf("%s",c);    for(int i=0;i<strlen(c);i++){        if(isalpha(c[i])==0){            printf("%c",c[i]);        }else if(isalpha(c[i])==2){            for(int j=0;j<26;j++){                if(a[j]==c[i]){                    printf("%c",b[j]);                    break;                }            }        }else if(isalpha(c[i])==1){            char ch=tolower(c[i]);            for(int j=0;j<26;j++){                if(a[j]==ch){                    printf("%c",toupper(b[j]));                    break;                }            }        }    }    return 0;}

更简单的模拟

C题

逆向思维。

一个初始值要满足所有的n,那么对于任意一个b[i]全部倒推其所有可能的初始值init[i],答案一定在这里面,检查这些init 是否可以推出其他的n-1个分数即可,注意去重

#include<stdio.h>#include<algorithm>#include<set>using namespace std;typedef long long ll;const int maxn=2100;ll a[maxn],b[maxn];ll pre[maxn];ll ini[maxn];ll bn[maxn];int k,n;set<ll> ans,init,bset,tmp;bool bs(ll des){    int l=0,r=n-1;   // int m=(l+r)/2;    while(l<=r){       int m=(l+r)/2;        if(b[m]==des){                   // printf("b[%d]=%d\n",m,b[m]);                    return true;        }        //return true;        if(b[m]<des){            l=m+1;        }else if(b[m]>des){            r=m-1;        }    }    return false;}int main(){    //int k,n;    scanf("%d%d",&k,&n);    for(int i=0;i<k;i++){        scanf("%I64d",&a[i]);    }    for(int i=0;i<n;i++){        scanf("%I64d",&b[i]);        bset.insert(b[i]);    }   // for(int i=0;i<k;i++)printf("%d ",a[i]);puts("");   // for(int i=0;i<n;i++) printf("%d ",b[i]);puts("");    pre[0]=a[0];    for(int i=1;i<k;i++){        pre[i]=pre[i-1]+a[i];    }    //for(int i=0;i<k;i++)printf("%d ",pre[i]);puts("");    for(int i=0;i<k;i++){        ini[i]=b[0]-pre[i];        init.insert(ini[i]);    }   // for(int i=0;i<k;i++) printf("%d ",ini[i]);puts("");    int res=0;    sort(b,b+n);    for(auto it=init.begin();it!=init.end();it++){        ll cur=*it;        int num=0;       // printf("cur=%d\n",cur);       tmp.clear();        for(int j=0;j<k;j++){                //printf("cur+pre[%d]=%d",j,cur+pre[j]);         //   if(bset.find(cur+pre[j])!=bset.end()){            if(bs(cur+pre[j])){                tmp.insert(cur+pre[j]);//就是这个地方要去重 WA了5次                if(tmp.size()==n){                   // ans.insert(cur);                   res++;                   // printf("anscur=%d\n",cur);                    break;                }                continue;            }        }    }    printf("%d\n",res);    return 0;}


原创粉丝点击