zoukankan      html  css  js  c++  java
  • Codeforces Round #597 (Div. 2)

    B. Restricted RPS

    贪心,下标i j要分清楚。。。

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define sc(x) scanf("%I64d",&x);
    #define si signed
    #define fi first
    #define se second
    #define pb push_back
    #define forn for(int i=0;i<n;i++)
    char s[105];
    int A[3],B[3];
    char t[105];
    si main()
    {
        int T,a,b,c,n;
        sc(T);
        while(T--)
        {
            sc(n)
            sc(B[2])sc(B[0])sc(B[1])
            scanf("%s",s);
            A[0]=A[1]=A[2]=0;
            for(int i=0; i<n; i++)
            {
                if(s[i]=='R')A[0]++;
                else if(s[i]=='P')A[1]++;
                else if(s[i]=='S')A[2]++;
            }
            int ans=0;
            for(int i=0; i<3; i++)
            {
                ans+=min(A[i],B[i]);
            }
           // cout<<ans<<'
    ';
            if(ans*2<n)
            {
                puts("NO");
            }
            else
            {
                puts("YES");
                memset(t,0,sizeof t);
                for(int i=0; i<n; i++)
                {
                    if(s[i]=='R'&&B[0])
                    {
                        t[i]='P';
                        B[0]--;
                       // cout<<i<<'i'<<B[0]<<endl;
                    }
                    else if(s[i]=='P'&&B[1])
                    {
                        t[i]='S';
                        B[1]--;
                    }
                    else if(s[i]=='S'&&B[2])
                    {
                        t[i]='R';
                        B[2]--;
                    }
                }
                t[n]='';
                for(int i=0; i<n; i++)
                {
                    if(t[i]==0)
                    {
                        for(int j=0; j<3; j++)
                        {
                            if(B[j])
                            {
                                if(j==0)
                                {
                                    t[i]='P';
                                }
                                else if(j==1)
                                {
                                    t[i]='S';
                                }
                                else
                                {
                                    t[i]='R';
                                }
                                B[j]--;
                                break;
                            }
                        }
                    }
                }
                cout<<t<<'
    ';
            }
     
        }
     
     
    }
     

    C. Constanze's Machine

    出现w或者m直接输出0

    出现连续个n或者u答案乘上dp[连续出现的个数k]

    dp可以递推得到

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define sc(x) scanf("%I64d",&x);
    #define si signed
    #define fi first
    #define se second
    #define pb push_back
    #define forn for(int i=0;i<n;i++)
    char s[100005];
    const int mod= 1e9+7;
    int dp[100005];
    void init()
    {
        dp[0]=dp[1]=1;
        for(int i=2;i<=100000;i++){
            dp[i]=(dp[i-1]+dp[i-2])%mod;
        }
    }
    si main()
    {
        init();
        scanf("%s",s+1);
        int n=strlen(s+1);
        int ans=1;
        for(int i=1;i<=n;){
            if(s[i]=='w'||s[i]=='m'){
                puts("0");
                return 0;
            }
            if(s[i]=='u'){
                int k=0;
                while(i<=n){
                    if(s[i]=='u')k++,i++;
                    else break;
                }
                ans=(ans*dp[k])%mod;
            }else if(s[i]=='n'){
                int k=0;
                while(i<=n){
                    if(s[i]=='n')k++,i++;
                    else break;
                }
                ans=(ans*dp[k])%mod;
            }else i++;
        }
        cout<<ans<<'
    ';
     
    }

    D. Shichikuji and Power Grid

    n个城市要通电,一些城市作为发电站,一些城市与发电站连边,实现所有城市供电,且代价最小

    最小生成森林?

    建立一个超级源点,每个城市与超级源点连边,权重为第i个城市建设发电站的代价

    问题就转化为普通最小生成树问题

    prim kruskal都可以

    注意保留下路径

    与0节点相连的都是自建发电站

    又是下标炸了==

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define sc(x) scanf("%I64d",&x);
    #define si signed
    #define fi first
    #define se second
    #define pb push_back
    #define forn for(int i=0;i<n;i++)
    int n;
    #define P pair<int,int>
    P A[2005];
    int C[2005];
    int K[2005];
    
    int d[2005];
    bool vis[2005];
    int mp[2005][2005];
    int pre[2005];
    vector<int>v;
    vector<P> vv;
    
    void prim()
    {
       // vis[0]=1;
        for(int i=1; i<=n; i++)
        {
            d[i]=1e18;
        }
        d[0]=0;
        for(int i=0; i<=n; i++)
        {
            int x=-1;
            for(int j=0; j<=n; j++)
                if(!vis[j]&&(x==-1||d[j]<d[x]))x=j;
            if(x==-1)break;
            vis[x]=1;
           // cout<<x<<endl;
            for(int j=0; j<=n; j++)
            {
                if(!vis[j]){
                   if(d[j]>mp[x][j]){pre[j]=x;d[j]=mp[x][j];}
                }
            }
        }
    }
    si main()
    {
        sc(n)
        for(int i=1; i<=n; i++)
        {
            sc(A[i].fi)
            sc(A[i].se)
        }
        for(int i=1; i<=n; i++)
        {
            sc(C[i])
            mp[i][0]=mp[0][i]=C[i];
        }
        for(int i=1; i<=n; i++)sc(K[i]);
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                mp[i][j]=(K[i]+K[j])*((labs(A[i].fi-A[j].fi))+(labs(A[i].se-A[j].se)));
            }
        }
        /*for(int i=0;i<=n;i++){
            for(int j=0;j<=n;j++){
                cout<<mp[i][j]<<' ';
            }
            cout<<endl;
        }*/
    
    
        prim();
        int ans=0;
        for(int i=0; i<=n; i++)
        {
            ans+=d[i];
        }
        cout<<ans<<'
    ';
        memset(vis,0,sizeof vis);vis[0]=1;
        for(int i=1;i<=n;i++){
            if(pre[i]==0){
                v.push_back(i);
                vis[i]=1;
            }
        }
        cout<<v.size()<<endl;
        for(int i=0;i<v.size();i++)cout<<v[i]<<' ';
        cout<<endl;
        for(int i=1;i<=n;i++){
            if(!vis[i]){
                vv.push_back(P(i,pre[i]));
                vis[i]=1;
            }
        }
        cout<<vv.size()<<endl;
        for(int i=0;i<vv.size();i++)cout<<vv[i].fi<<' '<<vv[i].se<<endl;
    
    
    
    }
  • 相关阅读:
    Java中Filter、Servlet、Listener的学习 (转)
    Servlet 获取商品信息作业
    Servlet 注册与提交作业
    jsp servlet的区别和联系(转)
    用户注册验证留言程序
    作业1
    简单新闻发布系统
    webform 增速删改查 方法
    存取数据库图片
    打印 保存
  • 原文地址:https://www.cnblogs.com/liulex/p/11780887.html
Copyright © 2011-2022 走看看