AOJ2012 Space Coconut Grab

問題リンク Space Coconut Grab

  • 解法

Z[x]: xが3乗の値かどうか
z[x]: v^3 = xとなるような値 v
の配列を作っておきます。
後は、xとyを共に0〜1000000まで回してx+y^2+z^3 = eとなるかを調べます。
表向きは(10^6)^2の計算量となりますが、実際には枝刈りがバサバサ入るので速く終わります。

  • ソース
import java.util.Scanner;

//Space Coconut Grab
public class AOJ2012 {

	void run(){
		Scanner sc = new Scanner(System.in);
		boolean[] Z = new boolean[1000001];
		int[] z = new int[1000001];
		for(int i=0;i<=100;i++){
			Z[i*i*i] = true;
			z[i*i*i] = i;
		}
		for(;;){
			int e = sc.nextInt();
			if(e==0)break;
			int res = 1<<29;
			for(int x=0;x<=1000000;x++){
				if(res<=x)break;
				for(int y=0;y<=1000000;y++){
					if(res<=x+y||e<x+y*y)break;
					if(!Z[e-x-y*y])continue;
					res = Math.min(res, x+y+z[e-x-y*y]);
				}
			}
			System.out.println(res);
		}
	}
	
	public static void main(String[] args) {
		new AOJ2012().run();
	}
}