UVa10120 - Gift?!

题目大意

美丽的村庄里有一条河,N个石头被放置在一条直线上,从左岸到右岸编号依次为1,2,...N。两个相邻的石头之间恰好是一米,左岸到第一个石头的距离也是一米,第N个石头到右岸同样是一米。礼物被放置在第M个石头上,Frank从左岸开始跳跃,对于第i步,必须跳2*i-1米,每次可以向左方向跳,也可以向右方向跳,跳到河岸跳跃就结束了,问Frank能否拿到礼物。

题解

每次跳跃有两种选择,向右或者向左,用搜索非常的好实现,只是2<=N<=10^6必须得跪。。。实在想不出怎么优化。。。看了下网上的题解,当N>=49一定能跳跃到M的位置上,直接输答案即可。。。即N<49用搜索,N>=49直接输答案。。。至于为什么N>=49就一定能跳跃M位置,algorithmist给出了详细的证明。

#include <iostream>

#include<cstdio>

using namespace std;

long m,n,flag;

void dfs(long ans, long step)

{

    if(ans>n||ans<1) return;

    if(ans==m)

    {

        flag=1;

        return;

    }

    dfs(ans+2*step+1,step+1);

    dfs(ans-2*step-1,step+1);

}

int main(void)

{

    while(scanf("%ld%ld",&n,&m)==2,n+m)

    {

        if(n>=49) printf("Let me try!\n");

        else

        {

        flag=0;

        dfs(1,1);

        if(flag) printf("Let me try!\n");

        else

        printf("Don't make fun of me!\n");

        }

    }

return 0;

}

 

 

你可能感兴趣的:(uva)