题目大意
美丽的村庄里有一条河,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; }