hdu 2149Public Sale(博弈论 巴什博奕)

Public Sale

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5919    Accepted Submission(s): 3472

Problem Description

虽然不想,但是现实总归是现实,Lele始终没有逃过退学的命运,因为他没有拿到奖学金。现在等待他的,就是像FarmJohn一样的农田生涯。

要种田得有田才行,Lele听说街上正在举行一场别开生面的拍卖会,拍卖的物品正好就是一块20亩的田地。于是,Lele带上他的全部积蓄,冲往拍卖会。

后来发现,整个拍卖会只有Lele和他的死对头Yueyue。

通过打听,Lele知道这场拍卖的规则是这样的:刚开始底价为0,两个人轮流开始加价,不过每次加价的幅度要在1~N之间,当价格大于或等于田地的成本价 M 时,主办方就把这块田地卖给这次叫价的人。

Lele和Yueyue虽然考试不行,但是对拍卖却十分精通,而且他们两个人都十分想得到这块田地。所以他们每次都是选对自己最有利的方式进行加价。

由于Lele字典序比Yueyue靠前,所以每次都是由Lele先开始加价,请问,第一次加价的时候,
Lele要出多少才能保证自己买得到这块地呢?

Input

本题目包含多组测试,请处理到文件结束(EOF)。每组测试占一行。
每组测试包含两个整数M和N(含义见题目描述,0<N,M<1100)

Output

对于每组数据,在一行里按递增的顺序输出Lele第一次可以加的价。两个数据之间用空格隔开。
如果Lele在第一次无论如何出价都无法买到这块土地,就输出"none"。

Sample Input

4 2
3 2
3 5

Sample Output

1
none
3 4 5

Author

Linle

 1 /*************************************************************************
 2     > File Name: code/hdu/2149.cpp
 3     > Author: 111qqz
 4     > Email: [email protected]
 5     > Created Time: 2015年09月22日 星期二 20时18分02秒
 6  ************************************************************************/
 7
 8 #include<iostream>
 9 #include<iomanip>
10 #include<cstdio>
11 #include<algorithm>
12 #include<cmath>
13 #include<cstring>
14 #include<string>
15 #include<map>
16 #include<set>
17 #include<queue>
18 #include<vector>
19 #include<stack>
20 #include<cctype>
21 #define y1 hust111qqz
22 #define yn hez111qqz
23 #define j1 cute111qqz
24 #define ms(a,x) memset(a,x,sizeof(a))
25 #define lr dying111qqz
26 using namespace std;
27 #define For(i, n) for (int i=0;i<int(n);++i)
28 typedef long long LL;
29 typedef double DB;
30 const int inf = 0x3f3f3f3f;
31 int n,m;
32 int main()
33 {
34   #ifndef  ONLINE_JUDGE
35    freopen("in.txt","r",stdin);
36   #endif
37     while (scanf("%d %d",&m,&n)!=EOF)
38     {
39     if (m<n+1)
40     {
41         printf("%d",m);
42         for ( int i = m+1 ; i <= n; i++)
43         printf(" %d",i);
44         printf("\n");
45         continue;
46     }
47     int tmp = m%(n+1);
48     if (tmp>0)
49     {
50         printf("%d\n",tmp);
51     }
52     else
53     {
54         puts("none");
55     }
56
57     }
58
59  #ifndef ONLINE_JUDGE
60   fclose(stdin);
61   #endif
62     return 0;
63 }

时间: 2024-10-19 21:05:05

hdu 2149Public Sale(博弈论 巴什博奕)的相关文章

hdu 2188 悼念512汶川大地震遇难同胞——选拔志愿者 (博弈论,巴什博奕)

悼念512汶川大地震遇难同胞——选拔志愿者 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6982    Accepted Submission(s): 4421 Problem Description 对于四川同胞遭受的灾难,全国人民纷纷伸出援助之手,几乎每个省市都派出了大量的救援人员,这其中包括抢险救灾的武警部队,治疗和防疫的医护人

HDU2149-Public Sale:简单巴什博奕

见代码,思路清晰 #include<iostream> using namespace std; int main() { int m, n; vector<int>V; while( cin>>m>>n ) { if( n>=m ) { bool IsFirst = true; for( int i=m; i<=n; i++ ) if( IsFirst ){ cout<<i; IsFirst = false; } else cout

博弈论一 [ 巴什博奕 ]

首先,这基本是关于ACM博弈论得一系列文章吧. 今天先讲一个最简单得博弈--巴什博奕. 其游戏规则是这样的: 有一堆n个石子,两个足够聪明的人玩,每个人可以去1-m个石子,取到最后一个石子为胜. 比如 n=7 ,m =3 那么先手必胜,过程大概如下, 先手取3,后首取i个,先手则拿4-i个,这样先手就拿到最后的石子了.(3+i+4-i=7,所以4-i就包含最后一个). 那么其实想法很简单. 当n%(m+1)==0,先手必输,否则先手必胜. 为什么? 当n%(m+1)==0,时,先手取i个,后手去

hdu 2897 巴什博奕变形

http://acm.hdu.edu.cn/showproblem.php?pid=2897 1.看清最后取的是输还是赢 2.分类讨论,想的时候,看怎么能回到最初状态---就是回到t*(p+q)+s的状态,以及怎么回到已经推出的必败态 #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <iostream> #include &l

hdu 1846 巴什博奕

http://acm.hdu.edu.cn/showproblem.php?pid=1846 以下摘自NEU培训课件 ?只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜. ?      cout<< n%(m+1)==0 ? "B" :"A"; ?显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜.因此我们发现了如何取胜的法则:如果 ?n=(m

HDU2149 Public Sale(巴什博奕)

才直到这种问题叫巴什博奕 换是老问题 多了一个第一次报价的输出取值 我分了两种情况 1.N>=M时 ,应该是输出M,M+1,...N 2.N<M时,输出s,s+N+1,...<=M (s来源于公式M%(N+1) == s) #include<cstdio> int main() { int M,N; while(scanf("%d%d",&M,&N)!=EOF){ if(M%(N+1)==0) printf("none\n&quo

HDU 1851 (巴什博奕 SG定理) A Simple Game

这是由n个巴什博奕的游戏合成的组合游戏. 对于一个有m个石子,每次至多取l个的巴什博奕,这个状态的SG函数值为m % (l + 1). 然后根据SG定理,合成游戏的SG函数就是各个子游戏SG函数值的异或和. 1 #include <cstdio> 2 3 int main() 4 { 5 int T, n; scanf("%d", &T); 6 while(T--) 7 { 8 scanf("%d", &n); 9 int s = 0,

巴什博奕

巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜. 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜.因此我们发现了如何取胜的法则:如果n=(m+1)*r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜.总之,要保

博弈:巴什博奕(Bash Game)威佐夫博奕(Wythoff Game)尼姆博奕(Nimm Game)

巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜 对于巴什博弈可以考虑:n=(m+1)*k+s,即如果n%(m+1)!=0则先取者只需取走s物品即可保证获胜. HDU 1846:裸的. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<limits.h> t