Codeforces Round #271 (Div. 2)

A水

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char str[200];
int mapp[300];
int main(){
    int i,k,j;
    char ccc[20];
    char kbd[300]="qwertyuiopasdfghjkl;zxcvbnm,./\n";
    for(i=0;i<strlen(kbd);i++){
        mapp[kbd[i]]=i;
    }
    while(cin>>ccc){
        while(cin>>str){
            if(ccc[0]=='L'){
                for(i=0;i<strlen(str);i++){
                    cout<<kbd[mapp[str[i]]+1];
                }
            }else if(ccc[0]=='R'){
                for(i=0;i<strlen(str);i++){
                    cout<<kbd[mapp[str[i]]-1];
                }
            }
        }
    }
    return 0;
}

 B大水,居然可以不用二分

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int num[100003],n,m;
long long sum[100003],qqq;
int main(){
    int i,j,k;
    while(scanf("%d",&n)!=EOF){
        memset(sum,0,sizeof(sum));
        for(i=1;i<=n;i++){
            scanf("%d",&num[i]);
            sum[i]=sum[i-1]+num[i];
        }
        scanf("%d",&m);
        while(m--){
            scanf("%I64d",&qqq);
            int low=1,high=n,mid=n,res;
            while(low<=high){
                mid=(low+high)/2;
                if(sum[mid]>=qqq){
                    res=mid;
                    high=mid-1;
                }else{
                    low=mid+1;
                }
            }
            printf("%d\n",res);
        }
    }
    return 0;
}

D DP,又是一个很好的dp题,一个由‘R’和‘W’构成的字符串中,w只能以连续k个存在,例如k=2,长度为4合法的字符串只有 RRWW   WWRR   WWWW RWWR RRRR,给出两个长度值a,b,问长度为[a,b]的串中合法的字符串有多少个。一开始我以为是一个排列组合问题,怎么做都无解,赛后发现是dp题(还是水题,哭)。dp[i]第i位有多少种字符串,当第i位选R时则dp[i]=dp[i-1],当第i位选W时则dp[i]=dp[i-k],所以转移方程为dp[i]=dp[i-1]+dp[i-k]

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int mod=1000000007;
const int nMax=100005;
long long dp[nMax+10];
int main(){
    int tcs,k,a,b,i;
    while(cin>>tcs>>k){
        memset(dp,0,sizeof(dp));
        for(i=1;i<k;i++){
            dp[i]=1;
        }dp[k]=2;
        for(i=k+1;i<=nMax;i++){
            dp[i]=(dp[i-k]+dp[i-1])%mod;
        }
        for(i=2;i<=nMax;i++){
            dp[i]=(dp[i]+dp[i-1])%mod;
        }
        while(tcs--){
            cin>>a>>b;
            cout<<(dp[b]-dp[a-1]+mod)%mod<<endl;
        }
    }
    return 0;
}

 

你可能感兴趣的:(codeforces)