| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
初学博弈,,留名,,,,,据我理解,,,博弈的一大类的解题办法是寻找必败点,,,,,
可以用sg函数,,但是这个题数据量大,,,不好弄,,,但是可以一步步的推出来,,,
依题意,,,设输入的数为n,,,那么我们知道了一个必败点,,,x>=n,,,,因为这个时候游戏已经结束了,,,
然后因为凡是能推出必败点的点一定是必胜点,,,那么就有了一个区间[(n+8)/9,n-1]内的点为必胜点,,,,那么可知,,区间[(p+1)/2,p-1](其中p=(n+8)/9;)内的点为必败点,,,,因为这个区间内的点,,不管怎么乘,,得到的数都属于[(n+8)/9,n-1],,再继续推,,一直到算出1是属于必胜点还是必败点,,,
之所以能这么推,,是因为一个点的后继点一定属于刚确定下来的区间,,,就是说如果能满足这样的条件,,我们就可以这样推,,否则还是用sg函数吧,,,,,
#include <iostream>
using namespace std;
int main()
{
__int64 p;
while(~scanf("%I64d",&p))
{
int t=0;
while(p!=1)
{
if(t%2==0)
p=(p+8)/9;
else
p=(p+1)/2;
t++;
}
puts(t%2?"Stan wins.":"Ollie wins.");
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator