Codeforces Round #597 (Div. 2)
贪心,下标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'; } } }
出现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'; }
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; }