Hatena::Grouptopcoder

hama_DU@TopCoderへの道

2011-05-27SRM300台を練習していく part4

SRM 310 PyramidOfCubes

|  SRM 310 PyramidOfCubes - hama_DU@TopCoderへの道 を含むブックマーク はてなブックマーク -  SRM 310 PyramidOfCubes - hama_DU@TopCoderへの道

http://www.topcoder.com/stat?c=problem_statement&pm=6577

一番下のlevelに入るcubeの個数が決まれば上面と底面の面積が求まる。

あとはlevelごとに側面積を求めていく。

ちょっと苦戦。汚いコードだ( ゚д゚)、ペッ


public class PyramidOfCubes {
	public double surface(int K) {
		long cnum = K;
		long dan = 0;
		long used = 0;
		double result = 0.0d;
		while (used < cnum) {
			dan++;
			used += dan * dan;
		}
		if (used == cnum) {
			result += dan * dan * 2;
			for (long d = 1 ; d <= dan ; d++) {
				result += d * 4;
			}
		} else {
			long unused = K;
			for (long d = dan ; d >= 1 ; d--) {
				if (unused <= d * d) {
					if (unused >= d) {
						long sht = (unused - 1) / d + 1;
						result += (d + sht) * 2;
					} else {
						result += (1 + unused) * 2;
					}
					if (d == dan) {
						result += unused * 2;
					}
					break;
				}
				if (d == dan) {
					result += dan * dan * 2;
				}
				result += d * 4;
				unused -= d * d;
			}
		}
		return result;
	}
}