【hdu2149】Public Sale
其实这道题本质上也是取石子问题,那么我们还是可以用博弈论来解决。
首先还是特判,若(n>=m)直接输出从n到m的所有整数即可。
然后作进一步分析,可以看到如果目前的竞价是m-(n+1),也就是说离m还有n+1的距离,那么此时轮到竞拍的人必输,所以要尽量给对手这样的点。
同样的,当i*(n+1)<m<(i+1)*(n+1)时,轮到竞价的人必定能赢得竞拍,此时第一次出价也仅有一种出价方法,即出价(m-i*(n+1));而当存在i*(n+1)== m时,必败,输出none。
其实代码和取石子问题差不多:
#include<cstdio> int main() { int n,m; while(~scanf("%d %d",&m,&n)) { if(n>=m) { for(int i=m;i<n;i++) printf("%d ",i); printf("%d\n",n); continue; } for(int i=1;;i++) { if(i*(n+1)<m&&m<(i+1)*(n+1)){printf("%d\n",m-i*(n+1));break;} else if(i*(n+1)==m){printf("none\n");break;} } } return 0; }