codeforces 597 div2 ABC

codeforces 597 div2

A:Good ol' Numbers Coloringhttp://codeforces.com/contest/1245/problem/A

觀察樣例發現大概是 \(gcd(a,b) \neq 1\)的時候是無限,試了下A了 面向樣例編程c++

除了cf應該不能這麼意識流編程 正賽的時候這一兩分鐘也沒那麼重要算法

B: Restricted RPS

中等複雜的模擬題,但我寫的時候一直wa,換了三種策略都沒成,後來在廣神的幫助下找到了是輸出字符數組沒有加結束符致使每次多樣例的輸出就會多不少東西,這種神奇的bug我還真是第一次遇到,記錄一下。編程

#include <bits/stdc++.h>
using namespace std;
char l[10001],out[10001];
int main(){
    //freopen("test.in","r",stdin);
    //freopen("test.out","w",stdout);
    int t,a,b,c,n,ans;
    cin>>t;
    while(t--){
        cin>>n;
        cin>>a>>b>>c;
        cin>>l;
        for(int i=0;i<n;i++){
            out[i]='0';
        }
        ans=0;
        
        for(int i=0;i<n;i++){
            if(l[i]=='R' && b>0){b--;ans++;out[i]='P';}
            if(l[i]=='P' && c>0){c--;ans++;out[i]='S';}
            if(l[i]=='S' && a>0){a--;ans++;out[i]='R';}
        }
        //cout<<out<<endl;
        for(int i=0;i<n;i++){
            if(out[i]=='0'){
                if(l[i]=='R')
                    if(a>0){a--;out[i]='R';}
                    else {c--;out[i]='S';}
                
                if(l[i]=='S')
                    if(c>0){c--;out[i]='S';}
                    else {b--;out[i]='P';}
                
                if(l[i]=='P')
                    if(b>0){b--;out[i]='P';}
                    else {a--;out[i]='R';}
                
            }
        }       
        
        if(n%2==0 && ans>=(n/2)){
            cout<<"YES"<<endl;
            for(int i=0;i<n;i++)printf("%c",out[i]);
            cout<<endl;
        }
        else if(n%2==1 && ans>(n/2)){
            cout<<"YES"<<endl;
            for(int i=0;i<n;i++)printf("%c",out[i]);
            cout<<endl;
        }
        else cout<<"NO"<<endl;
    }
return 0;
}

總結下就是算法沒有問題可是wa得很靠前的時候,仍是要注意下像輸入輸出啊預處理啊這種東西,想起來秦皇島哪一個暴力dp也是由於預處理的字符表有問題瘋狂wa。數組

C Constanze's Machine

題意:

規則1:字符串中的m會被寫成nn,w寫成uuspa

輸入爲原字符串通過規則1轉化而來的字符串,問原字符串有多少種可能。rest

思考:

1.若給定串中有m或w,則出錯,ans=0code

2.分塊ci

​ 將連續的(大於等於2個)的u/n連續子串分開,每一個長度爲 \(l1,l2,l3...lm\) 容易發現對於每一個子串,字符串

ans[li]=ans[li-1]-ans[i-2];

斐波那契啊這是!那這下就解決了get

#include<bits/stdc++.h>
using namespace std;
const long long mod = 1000000007;
long long fib[201111],pre[2000011];
char a[200011];
int main(){
    fib[0]=1;fib[1]=1;
    for(int i=2;i<100212;i++){fib[i]=(fib[i-1]+fib[i-2])%mod;}
    cin>>a;
    long long len=strlen(a),pos=0,num=0,ans=1;
    for(int i=0;i<len;i++)if(a[i]=='w' || a[i]=='m'){cout<<'0'<<endl;return 0;}
    while(pos<len){
        if(a[pos]=='u' && a[pos+1]=='u'){
            while(a[pos]=='u' && pos<len){
                pos++;
                pre[num]++;
            }
            num++;
        }
        else if(a[pos]=='n' && a[pos+1]=='n'){
            while(a[pos]=='n' && pos<len){
                pos++;
                pre[num]++;
            }
            num++;
        }
        else pos++;
    }
    if(num==0){cout<<1<<endl;return 0;}
    for(int i=0;i<num;i++)ans = (long long) ans * fib[ pre[i]] % mod;
    cout<<ans<<endl;
return 0;
}
相關文章
相關標籤/搜索