三色抽卡游戏 博弈论nim
作者:互联网
你的对手太坏了!在每年的年度三色抽卡游戏锦标赛上,你的对手总是能打败你,他的秘诀是什么?
在每局三色抽卡游戏中,有n个卡组,每个卡组里所有卡片的颜色都相同,且颜色只会是红(R)、绿(G)、蓝(B)中的一种。第i个卡组有vi张卡片。
对决双方每次只能选择一个还未抽完卡的卡组,从中拿走若干张卡片,可以全拿走,但不能一张都不拿。你只能选择颜色为红或者绿的卡组,而对手只能选择颜色为蓝或者绿的卡组。
你是先手,你和对手轮流行动,谁不能操作了就输了。
因为你的对手每次总是能打败你,你决定写一个程序来帮助你做出决策。
给定游戏刚开始时的卡组情况,你的程序需要判断假设双方都按照最优策略操作,那么你是否会赢?
Input
第一行包含一个正整数T(1≤T≤100),表示测试数据的组数。每组数据第一行包含一个正整数n(1≤n≤1000),表示卡组的数量。
接下来n行,每行一个字符ci(ci∈{′R′,′G′,′B′})和一个正整数vi(1≤vi≤1000),分别表示第i个卡组的颜色以及卡片数量。
Output
对于每组数据输出一行,若你能赢,输出YES,否则输出NO。Sample Input
3 2 R 2 B 3 2 B 2 R 3 3 R 5 B 6 G 1
Sample Output
NO YES NO
主要是看绿色的牌 看谁能多抽一张 或者平局 就是nim游戏 比赛的时候没有反应过来 一直在找规律 不过反应过来也不会写
nim游戏只要进行位运算即可
#include<bits/stdc++.h> using namespace std; //input #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);i--) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define inf 0x3f3f3f3f #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define N 500+5 int main() { int cas; RI(cas); while(cas--) { int n; RI(n); int hong=0; int lan=0; int flag=0; while(n--) { char s[4]; RS(s);int x;RI(x); if(s[0]=='B')lan+=x; if(s[0]=='R')hong+=x; if(s[0]=='G')flag^=x; } if(flag)hong++; if(hong>lan) printf("YES\n"); else printf("NO\n"); } return 0; }View Code
标签:卡片,卡组,nim,NO,scanf,博弈论,游戏,抽卡,define 来源: https://www.cnblogs.com/bxd123/p/10658112.html