第六次寒假训练赛题解
A CodeForces - 21A
简单模拟,模就完事了
#include<bits/stdc++.h> using namespace std; bool judge(int c) { return (c>=97&&c<=122)||(c>=65&&c<=90)||(c>=48&&c<=57)||c==95; } int main() { int t=0; int c=getchar(); while(judge(c)) { t++; c=getchar(); } if(t>=1&&t<=16&&c=='@') { L: t=0; c=getchar(); while(judge(c)) { t++; c=getchar(); } if(t>=1&&t<=16) { if(c=='\n') cout << "YES" << endl; else if(c=='.') goto L; else if(c=='/') { t=0; c=getchar(); while(judge(c)) { t++; c=getchar(); } if(t>=1&&t<=16&&c=='\n') cout << "YES" << endl; else cout << "NO" << endl; }else cout << "NO" << endl; }else cout << "NO" << endl; } else cout << "NO" << endl; return 0; }
B CodeForces - 49B
简单模拟,模就完事了
#include<bits/stdc++.h> using namespace std; int main() { int a,b; cin >> a >> b; int t=a,d=2; while(t) { d=max(d,t%10+1); t/=10; } t=b; while(t) { d=max(d,t%10+1); t/=10; } t=0; int k=1; while(a||b) { t+=(a%10)*k; t+=(b%10)*k; a/=10; b/=10; k*=d; } int ans=0; while(t) { t/=d; ans++; } cout << ans << endl; return 0; }
C CodeForces - 128B
优先队列,后缀自动机也可,这里只写优先队列的方法
#include <bits/stdc++.h> using namespace std; struct str { string s; int num; bool operator <(const str &x)const { if(x.s==s) return num>x.num; return s>x.s; } } x; int main() { priority_queue<str> q; string s; int n; cin>>s; cin>>n; for(int i=0; i<s.size(); i++) { x.s=s[i]; x.num=i; q.push(x); } while(!q.empty()) { x=q.top(); q.pop(); n--; if(!n) break; if(x.num<s.size()-1) { x.num++; x.s+=s[x.num]; q.push(x); } } if(n) cout<<"No such line."<<endl; else cout<<x.s<<endl; return 0; }
D CodeForces - 190C
简单递归一下就行
#include <bits/stdc++.h> using namespace std; string s,ans; bool flag= true; void input() { if (cin >> s) { ans+=s; if (s=="pair") { ans+='<'; input(); ans+=','; input(); ans+='>'; } } else flag= false; } int main() { cin >> s; input(); if (cin >> s) flag= false; if(flag) cout << ans << endl; else cout << "Error occurred" << endl; return 0; }
E CodeForces - 798B
暴力算最值
#include<bits/stdc++.h> using namespace std; int n; string a[55],t; int sum=1<<30; int main() { cin>>n; for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<n;i++) { int ans=0; for(int j=0;j<n;j++) { if(i==j) continue; t=a[j]+a[j]; if(t.find(a[i])==-1) { cout<<-1<<endl; return 0; } ans+=t.find(a[i]); } sum=min(ans,sum); } cout << sum << endl; return 0; }
F CodeForces - 1043C
字典序最小的时候s必然是前面全是a,后面全是b这个样子,以此为规则模拟一下会发现只要是s[i]!=s[i+1]就应该翻转
#include <bits/stdc++.h> using namespace std; string s,ans=""; int main() { cin >> s; for(int i=0;i<s.size()-1;i++) { if(s[i]!=s[i+1])ans+="1 "; else ans+="0 "; } if(s[s.size()-1]=='a')ans+="1"; else ans+="0"; cout << ans << endl; return 0; }