
博弈
文章平均质量分 72
围巾的ACM
啊啊什么时候也能成为一个大牛啊
展开
-
UESTC 1253 阿里巴巴和n个大盗(博弈)
思路:一个很经典的博弈问题,转自大神的题解 首先总人数是n+1人。 由于必须半数以上人同意才能通过方案,所以当剩余两个人时2号必死,因为1号不同意就能独吞。因此2号必须同意3号的方案,所以3号无论什么方案都会被通过,因此他会选择把所有宝石留给自己。 当总人数三个以上时就有以下的情况:显然4号需要至少3人的同意,可知3号是无论如何不会同意的,因此他只需要拉拢1,2号即可,也就是给他们1,1的宝原创 2016-05-24 21:03:17 · 428 阅读 · 0 评论 -
HDU 1517 A Multiplication Game(博弈)
思路:找规律题.... #include using namespace std; #define LL long long int main() { double n; while(scanf("%lf",&n)!=EOF) { while(n>18) n/=18; if(n<=9) printf("Stan wins.\n"); els原创 2016-07-08 20:36:30 · 328 阅读 · 0 评论 -
hdu1848 Fibonacci again and again(博弈)
思路:SG函数模板,好神奇的感觉.... #include #include #include using namespace std; const int maxn = 1001; int fac[maxn],sg[maxn],hashh[maxn]; void getSG(int n) { memset(sg,0,sizeof(sg)); for(int i = 1;原创 2016-07-08 22:14:08 · 339 阅读 · 0 评论 -
hdu5724 Chess(博弈)
思路:对位运算不太熟..显然这里是一个组合游戏,只需要将一行的情况用sg函数求出来,那么组合就是随便异或了,由于一行只有20个位置,所以考虑用状态压缩一下,将所有可行的后续状态枚举出来即可 #include using namespace std; int n,m,sg[1<<21],vis[21]; int dfs(int x) { memset(vis,0,sizeof(vis)原创 2016-07-20 14:39:10 · 1137 阅读 · 2 评论 -
HDU 2176 取(m堆)石子游戏(博弈)
思路:一个经典的Nim博弈 #include using namespace std; const int maxn = 200000+50; int a[maxn]; int main() { int n; while(scanf("%d",&n)!=EOF && n) { int sum = 0; for(int i = 1;i<=n;i++) { scanf原创 2016-07-20 20:09:26 · 428 阅读 · 0 评论 -
HDU 1850 Being a Good Boy in Spring Festival(博弈)
思路:一个基础的Nim博弈,首先我们要知道一个东西就是a1^a2^a3....an=0的话那么先手是必败的, 若a1^a2^...^an!=0,一定存在某个合法的移动,将ai改变成ai'后满足a1^a2^...^ai'^...^an=0。若a1^a2^...^an=k,则一定存在某个ai,它的二进制 表示在k的最高位上是1(否则k的最高位那个1是怎么得到的)。这时ai^k成原创 2016-07-20 20:35:11 · 922 阅读 · 0 评论 -
hdu5795 A Simple Nim(博弈找规律)
思路:大概手动算了一下sg的值,算到8的时候其实就知道了,当为7的倍数的时候sg值为8,为8的倍数时候sg值为7,然后其他的话都是sg(x)=x的,然后异或异或就可以了 #include using namespace std; const int maxn= 1e6+7; #define LL long long int a[maxn]; int main() { int T;原创 2016-08-04 20:50:23 · 469 阅读 · 0 评论 -
51nod 1605 棋盘问题(博弈)
思路:1或者非2质数其实就是奇数,统计有多少个黑色,判一下奇偶即可 #include using namespace std; int main() { int T; scanf("%d",&T); while(T--) { int n,m,cnt=0; scanf("%d%d",&n,&m); for(int i = 1;i<=n;i++) for(i原创 2016-09-22 23:27:30 · 496 阅读 · 0 评论 -
hdu5963 朋友(博弈找规律)
思路:先考虑是一条链的情况,每次操作一个节点,原本1的变0,0的变1,比较容易猜到的就是与根节点连边的奇偶性相关,然后树或者森林其实也是同理的。。 #include using namespace std; const int maxn = 40005; vector >e[maxn]; int main() { int T; scanf("%d",&T); while(T--)原创 2016-11-05 17:35:16 · 1302 阅读 · 0 评论 -
CodeForces 493D Vasya and Chess(博弈)
思路:可以先考虑一下n分别为2,3,4的情况,如果n=2,那么显然是白方胜,而n=3那么是黑方胜,n=4相当于白先走一步然后代换成n=3的情况,那么还是白方胜,猜测一发和n的奇偶性相关 #include using namespace std; int main() { int n; scanf("%d",&n); if(n&1) { p原创 2016-11-20 21:20:10 · 413 阅读 · 0 评论 -
HDU 2149 Public Sale(博弈)
思路:一个基础的巴什博奕 #include using namespace std; int main() { int n,m; while(scanf("%d%d",&m,&n)!=EOF) { if (m%(n+1)==0) printf("none\n"); else { if(n>=m) { printf("%d",m);原创 2016-07-08 16:53:47 · 271 阅读 · 0 评论 -
HDU 3951 Coin Game(博弈)
思路:一个环形的巴什博奕。如果k>=n显然就是先手必胜,而手推了一下发现,如果k为1的时候则看n的奇偶性,而k不为1的时候,无论先手取哪里,只要后手选择与之对称的点,最后一定是后手必胜。 #include using namespace std; int main() { int T,cas=1; scanf("%d",&T); while(T--) { int n,k;原创 2016-07-08 16:29:33 · 548 阅读 · 0 评论 -
HDU 3863 No Gambling(博弈)
思路:先手必胜.... #include using namespace std; int main() { int n; while(scanf("%d",&n)!=EOF && n!=-1) { printf("I bet on Oregon Maple~\n"); } } Description One day, Fl原创 2016-07-08 16:06:06 · 428 阅读 · 0 评论 -
HDU 1079 Calendar Game(博弈找规律)
思路:看了下样例猜了一下日期加月份的奇偶性....不过要注意9月30和11月30这两个日期是特别的 #include using namespace std; int main() { int T; scanf("%d",&T); while(T--) { int y,m,d; scanf("%d%d%d",&y,&m,&d); if((m+d)%2==0 || (原创 2016-07-03 10:38:10 · 1255 阅读 · 0 评论 -
HDU 1525 Euclid's Game(博弈)
题意:给出正整数a,b,每次可以用大的数减去小的数的倍数,最后谁操作完出现0就赢 思路:自己模拟一下,显然会出现一个局面是变成b,a%b,如果a==b或者a%b==0那么先手必胜,a>=2b那么先手可以把它变成b,a%b也是先手必胜,而b #include using namespace std; int main() { int a,b; while(scanf("%d%d",原创 2016-07-03 10:41:15 · 351 阅读 · 0 评论 -
HDU 1564 Play a game(博弈找规律)
思路:大概画了几盘...n为偶数的时候就是先手必胜,奇数就是后手必胜 #include using namespace std; int main() { int n; while(scanf("%d",&n)!=EOF && n) { if(n%2==0) cout << "8600" << endl; else cout << "ailyanlu" <<原创 2016-07-03 10:43:11 · 340 阅读 · 0 评论 -
HDU 1846 Brave Game(博弈)
思路:基础的巴什博奕,若n%(m+1)==0那么先手必败,显然如果n=m+1,那么先手只能拿最多m个,最后后手肯定能拿走最后的剩下的。那么可以看出取胜法则是n=(m+1)*r+s (s #include using namespace std; int main() { int T; scanf("%d",&T); while(T--) { int n,m; scanf原创 2016-07-03 10:49:06 · 395 阅读 · 0 评论 -
HDU 1847 Good Luck in CET-4 Everybody!(博弈)
思路:手推了一下1到10的情况,发现是3的倍数的时候必败,其他情况必胜 #include using namespace std; int main() { int n; while(scanf("%d",&n)!=EOF) { if(n%3==0) cout << "Cici" << endl; else cout << "Kiki"<<endl; } }原创 2016-07-03 10:51:30 · 262 阅读 · 0 评论 -
hdu5754 Life Winner Bo(博弈)
思路:国王和车手玩很快就出来规律了,马的话比较烦,可是不过手玩一下也是可以发现规律的...然后皇后其实就是一个威佐夫博弈 #include using namespace std; const int maxn = 1e6+7; int sg[maxn]; void init() { int cnt = 1; for(int i = 2;i<=1000;i++) { if(!s原创 2016-07-26 20:42:23 · 398 阅读 · 0 评论 -
HDU 2188 悼念512汶川大地震遇难同胞――选拔志愿者(巴什博奕)
思路:基础的巴什博奕 #include using namespace std; int main() { int T; scanf("%d",&T); while(T--) { int n,m; scanf("%d%d",&n,&m); if(n%(m+1)==0) cout << "Rabbit\n"; else cout << "G原创 2016-07-08 11:32:45 · 313 阅读 · 0 评论 -
HDU 2516 取石子游戏(博弈)
思路:手推了一下,发现n是斐波那契数时是必败态 #include using namespace std; #define LL long long int fact[105]; void init() { fact[0]=1; fact[1]=2; for(int i = 2;i<=44;i++) fact[i]=fact[i-1]+fact[i-2]; } int m原创 2016-07-08 14:46:17 · 387 阅读 · 0 评论 -
HDU 2897 邂逅明下(博弈)
思路:一个变形的巴什博奕... 考虑如果n=(p+q)*r的话,那么A先取q个,然后每次B取K个,A再去p+q-K个,这样最后肯定会留给B p个,所以必胜。 如果n = (p+q)*r+s(s 如果n = (p+q)*r+s(s>p),A先取T个,使得s-T 感觉智商不够用..... #include using n原创 2016-07-08 15:06:37 · 328 阅读 · 0 评论 -
CodeForces 347C Alice and Bob(博弈)
思路:手玩一下样例可以发现,如果gcd(a,b)==1(a>b),那么可以构造出1-b的所有出来,那么把所有都gcd起来,用最大的元素/gcd-n,那么就是还可以添加的元素,然后看奇偶就可以了 #include using namespace std; const int maxn = 1005; int a[maxn]; int main() { int n; scanf("%d"原创 2017-01-19 20:46:00 · 673 阅读 · 0 评论