kmjp's blog

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

TopCoderOpen 2018 Wildcard Round Easy CubesOnATable

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であるとミスした…。