A ICPC Balloons
思路:
简单的 if-else 或者是 swich-case。果然我只有碰到这种简单题才能想到多解。
代码:
1 2 3 4 5 6 7 8 9
| void solve() { char c; cin>>c; if(c=='A')cout<<"red"; else if(c=='B')cout<<"orange"; else if(c=='C')cout<<"blue"; else if(c=='D')cout<<"green"; }
|
B String Covering
思路:
可以发现,单个 1 是染不出来的。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| void solve() { int n; cin>>n; string s; cin>>s; bool flag=true; int i=0; while(i<n){ if(s[i]=='1'){ int j=i; while(j<n&&s[j]=='1')j++; if(j-i==1){ flag=false; break; } i=j; }else i++; } if(flag)cout<<"YES"<<endl; else cout<<"NO"<<endl; }
|
C Get The Sequence
思路:
遍历 a[i] 如果 a[i]>=b[pos] 那么 pos++ 否则就找下一个 a 来匹配。不匹配的 a 可以直接删除。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| void solve() { int n,m; cin>>n>>m; vector<int>a(n); vector<int>b(m); for(int i=0;i<n;i++) { cin>>a[i]; } for(int i=0;i<m;i++) { cin>>b[i]; } int j=0; for(int i=0;i<n&&j<m;i++) { if(a[i]>=b[j]){ j++; } } if(j==m)cout<<"YES"<<endl; else cout<<"NO"<<endl; }
|
D Longest Subsequence
思路:
要求最长子序列,我们可以用 dp[x] 来记录以 x 结尾的最长子序列的长度,它只能从 dp[x-1] 或 dp[x+1] 上演变过来。
所以 dp[x]=max(dp[x],max(dp[x-1],dp[x+1])+1)。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| void solve() { int n; cin>>n; vector<int> a(n); for(int i=0;i<n;i++) { cin>>a[i]; } vector<int> dp(n+5,0); int ans=0; for(int i=0;i<n;i++) { int m=max(dp[a[i]+1],dp[a[i]-1])+1; dp[a[i]]=max(m,dp[a[i]]); ans=max(ans,dp[a[i]]); } cout<<ans<<endl; }
|
E Eat The Candy
思路:
对每一个盒子都计算它所能达到的最大值,最后取所有盒子的最大值。
对于每个位置计算:从左边能搬多少糖到 i、从右边能搬多少糖到 i。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| void solve() { int n; cin>>n; vector<int> a(n); for(int i=0;i<n;i++) { cin>>a[i]; } vector<int> b(n),c(n); int now=a[0]; for(int i=0;i<n-1;i++) { b[i+1]=b[i]+min(a[i+1],now); now=a[i+1]-min(a[i+1],now); } now=a[n-1]; for(int i=n-1;i>=1;i--) { c[i-1]=c[i]+min(now,a[i-1]); now=a[i-1]-min(a[i-1],now); } int ans=0; for(int i=0;i<n;i++) { int m=a[i]; if(i)m+=b[i-1]; if(i!=n-1)m+=c[i+1]; ans=max(ans,m); } cout<<ans<<endl; }
|
F Bracket Coloring
思路:
括号匹配想到用栈。每一对括号考虑其前后是否相同。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| const int MOD=998244353; void solve() { int n; cin>>n; string s; cin>>s; int ans=1; vector<int> st; for(int i=0;i<s.size();i++) { if(s[i]=='('){ if(i==0||s[i-1]==')') st.push_back(1); else st.push_back(0); }else{ if(st.size()==1){ ans=ans*2%MOD; }else if(st.back()==1){ if(i==s.size()-1||s[i+1]=='(') ans=ans*2%MOD; } st.pop_back(); } } cout<<ans<<endl; }
|