問題読み解くのに手間取った…。
https://community.topcoder.com/stat?c=problem_statement&pm=18148
問題
元の問題文を大幅に意訳する。
3桁の数をN個作りたい。
100の位に使える0~9の個数と、10の位に使える0~9の個数と、1の位に使える0~9の個数はそれぞれ同じである(総和はもちろんN)
N個作った3桁の数は、100/10/1の位の数がすべて異なっていなければならない。
そのようなN個の3桁の数を構築可能か、可能なら一例を示せ。
解法
100の位に使える数字を昇順に並べてみる。
サンプル3なら"0011122233"となる。
この時、最多出現の数字の個数をxとする。
10の位は、xだけrotateして"2330011122"、1の位はさらにx rotateして"1222330011"とする。
あとはこの3つを縦につなげて3桁の数を作ればよい。
N<3*xの場合解なし。
0011122233 2330011122 1222330011
string S[3]={"0123456789","abcdefghij","ABCDEFGHIJ"}; class FormTriples { public: string solve(int N, vector <int> C) { int sum=0; int ma=0; int i,j; FOR(i,N) { sum+=C[i]; if(C[ma]<C[i]) ma=i; } if(C[ma]*3>sum) return ""; string A[3]; FOR(i,3) { FOR(j,N) A[i]+=string(C[(ma+j)%N],S[i][(ma+j)%N]); FOR(j,i) rotate(A[i].begin(),A[i].begin()+C[ma],A[i].end()); cout<<A[i]<<endl; } string ret; FOR(i,sum) FOR(j,3) ret+=A[j][i]; return ret; } }