CodeForces #101 (Div. 2)
問題Aはhttp://codeforces.com/problemset/problem/141/A
A.
文字を数えて、同じかどうか判定すればよい
int memo[26]; string a,b,c; int r; int main(){ cin>>a>>b>>c; for(int i=0;i<a.size();i++){ memo[a[i]-'A']++; } for(int i=0;i<b.size();i++){ memo[b[i]-'A']++; } for(int i=0;i<c.size();i++){ memo[c[i]-'A']--; } for(int i=0;i<26;i++){ if(memo[i]) r++; } if(r){ cout<<"NO"<<endl; } else { cout<<"YES"<<endl; } return 0; }
B.
実装すればよい。これよりシンプルに書ける。
long a,x,y; int main(){ cin>>a>>x>>y; if(y<=0){ cout<<-1<<endl; return 0; } if(0<y&&y<a){ if(-a<2*x&&2*x<a){ cout<<1<<endl; }else{ cout<<-1<<endl; } return 0; } y-=a; int b=2*a; int my=y%b; int dy=y/b; if(0<my&&my<a){ if(-a<2*x&&2*x<a){ cout<<2+3*dy<<endl; }else{ cout<<-1<<endl; } }else if(a<my&&my<b){ if(-a<x&&x<0){ cout<<3+3*dy<<endl; }else if(0<x&&x<a){ cout<<4+3*dy<<endl; }else{ cout<<-1<<endl; } }else{ cout<<-1<<endl; } return 0; }
C.
背の高さの順番を決めてから、背の高い方から並び順を入れ替えていく。挿入ソートしてるみたいだけど、用語とかは分かりません。
int n,m[3000],s[3000]; int main(){ cin>>n; vector<pair<int,string> > p(n); for(int i=0;i<n;i++){ cin>>p[i].second>>p[i].first; s[i]=m[i]=i; } sort(p.begin(),p.end(),greater<pair<int,string> >()); for(int i=n-1;i>=0;i--){ if(p[i].first+i>=n){ cout<<-1<<endl; return 0; } for(int j=0;j<p[i].first;j++){ swap(m[i+j],m[i+j+1]); } } for(int i=0;i<n;i++){ cout<<p[m[i]].second<<' '<<s[m[i]] + 100<<endl; } return 0; }
D.
ダイクストラ法の問題らしいけど、問題を理解できてない。練習になりそうだから、後で解きたい
E.
最小全域木らしいけど、最小全域木がほとんど分からない。あと問題を理解できてない。
割と良く出るらしいから、早いうちに解けるようになりたい。