Easyをしょうもないミスで落とした。
http://community.topcoder.com/stat?c=problem_statement&pm=15010
問題
マス目の振られたテーブルの上に、1辺の長さ1の立方体をマス目に沿っていくつか積む。
その際、表面積をSにできるか。
解法
すでにある立方体の上に1個立方体を積むと、表面積を4追加することができる。
よって、表面積を4で割ったとき0,1,2,3となるような最小の積み方を考えよう。
- S mod 4 == 0 : 2つ横に並べると表面積が8となる。4は構築不可。
- S mod 4 == 1 : 1つ置くと表面積が5となる。1は構築不可。
- S mod 4 == 2 : 2つ離れたところに置くと表面積が10となる。2,6は構築不可。
- S mod 4 == 3 : 3つ並べて置くと表面積が11となる。3,7は構築不可。
class CubesOnATable { public: void push(vector<int>& v,int x,int y,int z) { v.push_back(x); v.push_back(y); v.push_back(z); } vector <int> placeCubes(int surface) { vector<int> ret,empty; if(surface<5 || surface==6 || surface==7) return empty; push(ret,0,0,0); if(surface%4==1) { surface-=5; } else if(surface%4==0) { push(ret,1,0,0); surface-=8; } else if(surface%4==2) { push(ret,1,1,0); surface-=10; } else if(surface%4==3) { push(ret,1,0,0); push(ret,2,0,0); surface-=11; } int nex=1; while(surface) { push(ret,0,0,nex++); surface-=4; } return ret; } }
まとめ
3つ並んだ立方体の表面積が12であるとミスした…。