Codeforces Round #609(Div.2) 参加記録
1733->1841(+108)
証明: ACをしました
A. Equation
問題
整数が与えられます。を満たすような合成数を求めてください。
制約
考察
とを出力すれば良いです。これらは合成数で、制約を満たします。
B. Modulo Equality
問題
要素の数列が与えられます。の各要素をで加算してから並べ替えてに一致させたいです。このことができる最小のを求めてください。
制約
考察
をの要素のいずれかに一致させなければならないので、これを全探索します。に一致させるときは、を満たす最小のを選べばよいです。試すべきの候補が通りあって、判定(ソートの部分)にかかるので計算量はです。
#include<bits/stdc++.h> using namespace std; int main() { int N,M; cin>>N>>M; vector<int> a(N),b(N); for(int i=0;i<N;i++) cin>>a[i]; for(int i=0;i<N;i++) cin>>b[i]; sort(b.begin(),b.end()); int ans=M; for(int i=0;i<N;i++){ int x=(b[i]-a[0]+M)%M; vector<int> c(N); for(int j=0;j<N;j++) c[j]=(a[j]+x)%M; sort(c.begin(),c.end()); if(c==b) ans=min(ans,x); } cout<<ans<<endl; return 0; }
C. Long Beautiful Integer
問題
桁の整数と正整数が与えられます。次の条件を満たす以上の整数のうち、最小のものを求めてください。
条件: 任意のについてが成り立つ。
制約
考察
条件から、先頭桁を決めると残りの桁も決まることが分かります(先頭桁を繰り返した形になります)。また答えは以上でなので、答えの先頭桁は、の先頭桁以上でなければなりません。よって、の先頭桁を繰り返した数が以上であれば、それが答えです。そうでなければ、条件を満たす数うち、次に大きいものは(の先頭桁+1)を繰り返した数です。これはより大きいので、これが答えになります。
#include<bits/stdc++.h> using namespace std; int main() { int N,K; cin>>N>>K; string x; cin>>x; string ans; for(int i=0;i<N;i++) ans+=x[i%K]; if(ans>=x){ cout<<N<<endl<<ans<<endl; return 0; } for(int i=K-1;i>=0;i--){ if(ans[i]=='9') ans[i]='0'; else{ ans[i]++; break; } } for(int i=K;i<N;i++) ans[i]=ans[i%K]; cout<<N<<endl<<ans<<endl; return 0; }
繰り上がりに注意しましょう(自省)。
D. Domino for young
問題
列の盤面があります。の高さはです。この盤面にのドミノを重ならないように置くとき、最大でいくつのドミノを置くことができるか求めてください。
制約
考察
盤面を市松模様に塗ることで、置けるドミノの個数の上界が分かります()。コンテスト中は祈りながら投げました。 縦横に2段以上ずれているところを消していけば階段状になるみたいで(ここよく分かってないです)、そうなれば色が少ない方を全部埋められます。
#include<bits/stdc++.h> using namespace std; using Lint=long long; int main() { int N; cin>>N; vector<int> a(N); for(int i=0;i<N;i++) cin>>a[i]; Lint cntB=0,cntW=0; for(int i=0;i<N;i++){ cntB+=(i%2==0? (a[i]+1)/2:a[i]/2); cntW+=(i%2==0? a[i]/2:(a[i]+1)/2); } cout<<min(cntB,cntW)<<endl; return 0; }
E. K Integers
転倒数+Absolute Minimaだと聞きました。転倒数は理解できておらず、Absolute Minimaはまだやっていないので、両方やってから戻ってこようと思います。