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;
}

 

 

posted on 2013-04-14 00:34  仗剑奔走天涯  阅读(275)  评论(0编辑  收藏  举报

导航