kmjp's blog

競技プログラミング参加記です

TopCoder SRM 851 : Div1 Medium FormTriples

問題読み解くのに手間取った…。
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;
		
		
	}
}

まとめ

問題文を読み間違えて、3桁の数同士が異なっていないといけないと思ってしまった。 大幅にタイムロス。