頑張ったけどレート増減0だった回。
https://codeforces.com/contest/1268/problem/A
問題
N桁の整数値Xと、正整数Kが与えられる。
X以上の整数のうち、K桁毎に同じ数値を繰り返す最小の値を求めよ。
解法
どこかの桁を増やすすることにすれば、それより下の値は任意に設定できる。
上から順に、桁の値をいじらないと「K桁毎に同じ数値を繰り返す」の条件に反する最初の場所を求め、それ以下の桁を合わせるようにしよう。
もしn桁目がn+m*K桁目より大きい場合、n+m*K桁目をn桁目に合わせ、それ以降の桁は手前の桁に合わせる。
もしn桁目がn+m*K桁目より小さい場合、n桁目をインクリメントし、(n+1)~K桁目は0にしてしまおう。
int N,K; string S; void solve() { int i,j,k,l,r,x,y; string s; cin>>N>>K>>S; int carry=0; FOR(i,N) { if(S[i]<S[i%K]) break; if(S[i]>S[i%K]) { carry=1; break; } } for(i=K-1;i>=0;i--) if(carry) { if(S[i]!='9') { S[i]++; break; } S[i]='0'; } cout<<N<<endl; FOR(i,N) cout<<S[i%K]; cout<<endl; }
まとめ
ちょっと戸惑う問題。