gotutiyan’s blog

競技プログラミングをやったりopenframeworksでお絵かきをしたりしています。

AOJ 宇宙ヤシガニ(Space Coconut Grab) 解説

問題
Space Coconut Grab | Aizu Online Judge


解説
3つの変数をループで回して全探索すると、O(10^9)となってTLEします。
しかし、x+y*y+z*z*z=eになることから、y,zが分かればxが分かります。

よってy,zを2重ループで回して、残りのxをx = e- y*y - z*z*z と算出できます。
このときの計算量はO(10^6)まで落ちるので間に合います。
またこの過程では、計算により求めたxの値がマイナスになることがあります。これはx+y*y+z*z*z=e において、左辺が大きくなりすぎているということなので、continueすることで除外します。

int main(){
    while(1){
        int e;
        int ans=1e9+7;
        cin>>e;
        if(e==0)break;
         
        rep(y,0,1000){
            rep(z,0,1000){
                int x=e-y*y-z*z*z;
                if(x<0)continue;
                ans=min(ans,x+y+z);
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}