Codeforces Round #597 (Div. 2) 补题题解

先补前面几题...之后再写题解

A.Good ol' Numbers Coloring

    #include <bits/stdc++.h>
    using namespace std;
     
    int gcd(int a,int b){
        return b==0? a:gcd(b,a%b);
    }    
    int main(){
        int n;
        int a,b;
        cin>>n;
        while(n--){
            cin>>a>>b;
            if(gcd(a,b)==1) puts("Finite");
            else puts("Infinite");
        }
        return 0;
        
        
    }
View Code

B. Restricted RPS (这个地方真写的太乱了)

    #include <bits/stdc++.h>
    using namespace std;
    //ch->int ;
    int trans(char ch){
        if(ch=='R') return 0;
        else if(ch=='P') return 1;
        else if(ch=='S') return 2;
    }
    //int->ch ;
    char transs(int x){
        if(x==0) return 'R';
        else if(x==1) return 'P';
        else if(x==2) return 'S';
    }
    //ch (a) - ch (b) ;
    char kill(char ch){
        if(ch=='R') return 'P';
        else if(ch=='P') return 'S';
        else if(ch=='S') return 'R';
    }
    //int(a) - int(b)
    int kills(int x){
        if(x==0) return 1;
        else if(x==1) return 2;
        else if(x==2) return 0; 
    }
    int main(){
        int t;
        cin>>t;
        string s;
        while(t--){
            int n;
            cin>>n;
            int a[4] = {0};
            int b[4] = {0};
            int match[4] = {0};
            int res[4] = {0}; 
            //记录a的所有部分 
            for(int i=0;i<3;i++){
                cin>>a[i];
            }
            cin>>s;
            for(int i=0;i<(int)s.size();i++){
                //对应b的石头尖子步的个数 
                b[trans(s[i])]++;
            }
            int ans = 0;
            //得到res与match值 
            for(int i=0;i<3;i++){
                //获得a,b最多匹配个数 
                match[i] = min(b[i],a[kills(i)]);
                //未匹配个数 
                res[i] = a[kills(i)] - match[i];
                ans += match[i]; 
            }
            if(ans>=(n+1)/2){
                puts("YES");    
                for(int i=0;i<(int)s.size();i++){
                    if(match[trans(s[i])]>0){
                        printf("%c",transs(kills(trans(s[i]))));
                        match[trans(s[i])]--;
                    }else{
                        for(int i=0;i<3;i++){
                            if(res[i]>0) {
                                printf("%c",transs(kills(i)));
                                res[i]--;
                                break;    
                            }
                        }
                    }
                }
                printf("\n");
            }else{
                puts("NO");
            }     
        }
    } 
View Code

C.Constanze's Machine

    #include <bits/stdc++.h>
    using namespace std;
     
    const int maxn = 1e5+5;
    const int mod=1e9+7;
    long long dp[maxn+5];
     
    void init(){
        dp[1] = 1;
        dp[2] = 2;
        for(int i=3; i<=maxn; i++){
            dp[i] = (dp[i-1] + dp[i-2])%mod;
            //cout<<dp[i]<<endl;
        }
        //cout<<dp[maxn-1]<<endl;
    }
     
    string str;
     
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0);
        init();
        cin>>str;
        int len=str.length();
        long long ans=1;
        int i=0;
        while(i<len){
            if(str[i]=='m' || str[i]=='w'){
                cout<<"0"<<endl;
                return 0;
            }
            if(str[i]=='n'){
                int cntn=0;
                while(str[i]=='n'){
                    cntn++;
                    i++;
                }
                ans = ans*dp[cntn]%mod;
            }
            else if(str[i]=='u'){
                int cntu=0;
                while(str[i]=='u'){
                    cntu++;
                    i++;
                }
                ans = ans*dp[cntu]%mod;
            }
            else i++;
        }
        cout<<ans<<endl;
    }
View Code

D.D - Shichikuji and Power Grid

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn = 3000;
    const int maxm = 5e6+5;
     
    int x[maxn],y[maxn],c[maxn],k[maxn];
    int px[maxm],py[maxm],p[maxm];
    int n,cnt,cnt0,cnt1,num;//边下标,非超级点连接边数,生成树连接边数
    int pre[maxn];
    struct Edge{
        int u,v;
        ll w;
    }edge[maxm];
    bool cmp(Edge a,Edge b){
        return a.w<b.w;
    }
    int find(int x){
        if(x!=pre[x]) return pre[x] = find(pre[x]);
        else return pre[x];
    }
    void inse(int u,int v,int w){
        edge[++cnt].u = u;
        edge[cnt].v = v;
        edge[cnt].w = (ll)w;
    }
    bool unite(int x,int y){
        int fx = find(x);
        int fy = find(y);
        if(fx!=fy){
            pre[fx] = fy;
            num++;
            return true;
        }
        else return false;
    }
    ll kruskal(int n){
        //先对所有边cost进行排序
        sort(edge+1,edge+cnt+1,cmp);
        int u,v;
        ll w,ans = 0;
        for(int i=1;i<cnt+1;i++){
            u =edge[i].u,v=edge[i].v,w=edge[i].w;
            if(unite(u,v)){
                if(u==0||v==0) p[++cnt1] = u+v;
                else px[++cnt0] = u,py[cnt0] = v;
                ans += w;
            }
            if(num==n-1) break;
        }
        if(num<n-1) return -1;
        return ans;
    }
    int main(){
        cin>>n;
        for(int i=1; i<=n; i++) cin>>x[i]>>y[i];
        for(int i=1; i<=n; i++) cin>>c[i];
        for(int i=1; i<=n; i++) cin>>k[i];
        for(int i=0; i<=n; i++) pre[i] = i;
        num = cnt = cnt0 = cnt1 = 0;
        //对每个结点建立边
        for(int i=1; i<=n; i++)
            for(int j=1;j<=n;j++){
                if(i==j) continue;
                ll w =(ll) (k[i]+k[j])*(abs(x[i]-x[j])+abs(y[i]-y[j])); 
                edge[++cnt] = (Edge){i,j,w};
            }
        //将所有点与超级点建立边,且花费为建站的费用
        for(int i=1; i<=n; i++) {
            inse(0,i,c[i]);
            inse(i,0,c[i]);
        }
        cout<<kruskal(n+1)<<endl;
        cout<<cnt1<<endl;
        for(int i=1; i<=cnt1; i++){
            if(i==cnt1) cout<<p[i]<<endl;
            else cout<<p[i]<<" ";
        }
        cout<<cnt0<<endl;
        for(int i=1; i<=cnt0; i++) cout<<px[i]<<" "<<py[i]<<endl;
    }
View Code

 

posted @ 2019-11-07 19:36  Tianwell  阅读(190)  评论(0编辑  收藏  举报