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<<'\n';
        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]='\0';
            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<<'\n';
        }
 
    }
 
 
}
 

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<<'\n';
 
}

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<<'\n';
    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;



}

 

posted @ 2019-11-02 10:20  liulex  阅读(252)  评论(0编辑  收藏  举报