Codeforces Round #442 (Div. 2) A+B+C

来源:互联网 发布:学生调查数据 填表 编辑:程序博客网 时间:2024/06/15 02:48

http://codeforces.com/contest/877
不告诉你们我写了几个qwq
A
写了比较麻烦了, 不过差不多,用了find函数来找的。

#include <bits/stdc++.h>using namespace std;string s;string w="Danil";string w2="Olya";string w3="Slava";string w4="Ann";string w5="Nikita";int main(){    cin>>s;     int sum=0;     bool flag=false;     if(s.find(w)!=string::npos){         int loc=s.find(w);         sum++;         if(s.find(w,loc+w.size())!=string::npos){            sum++;            flag=true;         }     }      if(!flag){            if(s.find(w2)!=string::npos){         int loc=s.find(w2);         sum++;         if(s.find(w2,loc+w2.size())!=string::npos){            sum++;            flag=true;         }     }     }     if(!flag){             if(s.find(w3)!=string::npos){         int loc=s.find(w3);         sum++;         if(s.find(w3,loc+w3.size())!=string::npos){            sum++;            flag=true;         }     }     }      if(!flag){             if(s.find(w4)!=string::npos){           int loc=s.find(w4);         sum++;         if(s.find(w4,loc+w4.size())!=string::npos){            sum++;            flag=true;         }     }     }      if(!flag){             if(s.find(w5)!=string::npos){         int loc=s.find(w5);         //cout<<"??"<<sum<<endl;         sum++;         if(s.find(w5,loc+w5.size())!=string::npos){            sum++;            flag=true;         }     }     }     if(!flag&&sum==1){         puts("YES");     }     else        puts("NO");        //cout<<sum<<endl;    return 0;}

b 我的写法是暴力,思路是显而易见的,代码是苦逼的。。(枚举的时候一直错)
dp作业更是惊艳

    #include <bits/stdc++.h>using namespace std;const int maxn=5e3+300;string a;int num1[maxn];int num2[maxn];int main(){   cin>>a;    num1[0]=0;    num2[0]=0;    int ans=-1;    for(int i=0;i<a.length();i++){        if(a[i]=='a'){            num1[i+1]=num1[i]+1;            num2[i+1]=num2[i];            }        else  if(a[i]=='b'){                num2[i+1]=num2[i]+1;        num1[i+1]=num1[i];        }    }    for(int i=0;i<=a.length();i++){         for(int j=i;j<=a.length();j++){             int len1=i;             int cos1=num1[i];             int len2=j-i;             int cos2=num2[j]-num2[i];             int len3=a.length()-j+1;             int cos3=num1[a.length()]-num1[j];             ans=max(ans,cos1+cos2+cos3);         }    }    //cout<<ans<<endl;    //cout<<num2[a.length()]<<endl;    //ans=max(num1[a.length()],ans);    //ans=max(num2[a.length()],ans);    printf("%d\n",ans);    return 0;}
#include <bits/stdc++.h>using namespace std;/* dp的做法。 用dp来做,真是太强了。*/const int maxn=5e3+1000;int dp[3][maxn];int main(){   int t;    string s;    while(cin>>s){    dp[0][0]=0;    dp[1][0]=0;    dp[2][0]=0;    memset(dp,0,sizeof(dp));    for(int i=0;i<s.length();i++){        if(s[i]=='a'){            dp[0][i+1]=dp[0][i]+1;            dp[2][i+1]=max(dp[2][i],dp[1][i])+1;             dp[1][i+1]=max(dp[1][i],dp[0][i]);        }        if(s[i]=='b'){            dp[1][i+1]=max(dp[1][i],dp[0][i])+1;            dp[0][i+1]=dp[0][i];            dp[2][i+1]=max(dp[2][i],dp[1][i]);        }    }    printf("%d\n",max(max(dp[1][s.length()],dp[2][s.length()]),dp[0][s.length()]));    }    return 0;}

C题,我根据两个样例构造了了一种方法。。 是基于mod3的。。。
然而mod4 的策略才是对的。。
还有直接mod2的。。
显然可以实现,最优性的说法是,如果比i小的地方和比i大的地方都要埃两下,一下是把他们逼到i,另一下i把他们打回去,再来一下??
理解的不够深入。

#include <bits/stdc++.h>using namespace std;int main(){    int n,i;    scanf("%d",&n);    printf("%d\n",n+n/2);    for(i=2;n>=i;i=i+2)    {        printf("%d ",i);    }    for(i=1;n>=i;i=i+2)    {        printf("%d ",i);    }    for(i=2;n>=i;i=i+2)    {        printf("%d ",i);    }    cout<<endl;    return 0;}
原创粉丝点击