Codeforces Round #604 题解
A题
本题根据题意模拟能解,不排除更好的做法
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<vector> #include<cstring> using namespace std; typedef long long ll; const int N=1e5+10; int main(){ int t; cin>>t; while(t--){ string s; cin>>s; int i; int flag=1; for(i=0;i<s.size()-1;i++){ if(s[i]==s[i+1]&&s[i]!='?'&&s[i+1]!='?'){ cout<<-1<<endl; flag=0; break; } } if(!flag) continue; int a=s.size()-1; if(a==0){ cout<<"a"<<endl; continue; } for(i=0;i<s.size()-1;i++){ if(s[i]=='?'&&s[i+1]!='?'){ if(i==0){ if(s[i+1]=='a') s[i]='b'; if(s[i+1]=='b') s[i]='c'; if(s[i+1]=='c') s[i]='a'; } else{ if(s[i-1]!=s[i+1]) s[i]=('a'+'b'+'c'-s[i+1]-s[i-1]); else{ if(s[i+1]=='a') s[i]='b'; if(s[i+1]=='b') s[i]='c'; if(s[i+1]=='c') s[i]='a'; } } } else if(s[i]=='?'&&s[i+1]=='?'){ if(i==0) s[i]='a'; else{ if(s[i-1]=='a') s[i]='b'; if(s[i-1]=='b') s[i]='c'; if(s[i-1]=='c') s[i]='a'; } } } if(s[a]=='?'){ if(s[i-1]=='a') s[i]='b'; if(s[i-1]=='b') s[i]='c'; if(s[i-1]=='c') s[i]='a'; } cout<<s<<endl; } }
B题
我们能够发现,只需要关注位置关系就能求解本题,所以我们设计一个pos数组记录每个值他的位置在哪
我们可以从1开始遍历到n,然后设计两个变量维护左右边界
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<vector> #include<cstring> using namespace std; typedef long long ll; const int N=2e5+10; int main(){ int t; cin>>t; int a[N]; int pos[N]; while(t--){ int n; cin>>n; int i,j; for(i=1;i<=n;i++){ cin>>a[i]; pos[a[i]]=i; } int l=pos[1]; int r=pos[1]; for(i=1;i<=n;i++){ l=min(pos[i],l); r=max(pos[i],r); if(r-l+1==i) cout<<1; else cout<<0; } cout<<endl; } }
C题
贪心题目,金牌越多越好,然后银牌只需要比金牌大,其他控制铜牌就可以,因为其他情况需要满足更多的条件
我们求取的是最大的奖牌数。
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<vector> #include<cstring> #include<map> using namespace std; typedef long long ll; const int N=2e5+10; map<int,int> m1; int main(){ int t; cin>>t; while(t--){ m1.clear(); int n; int i; cin>>n; int h; for(i=1;i<=n;i++){ cin>>h; m1[-h]++; } if(m1.size()<3){ cout<<"0 0 0"<<endl; continue; } int g=0; int s=0; int b=0; int flag=0; for(auto x:m1){ if(flag==0){ if(g+s+b+x.second>n/2) break; g=x.second; flag++; } else if(flag==1){ if(g+s+b+x.second>n/2) break; s+=x.second; if(s>g) flag++; } else{ if(g+s+b+x.second>n/2) break; b+=x.second; } } if(g==0||s==0||b==0) cout<<"0 0 0"<<endl; else if(g>=s||g>=b) cout<<"0 0 0"<<endl; else cout<<g<<" "<<s<<" "<<b<<endl; } }
没有人不辛苦,只有人不喊疼