Codeforces 142D(博弈)
2024-09-06 11:41:05
要点
- 不难发现问题转化成:n堆石子,每次最多选k堆最少选1堆然后拿走一个石子,谁先没子可拿谁败。本题中撤退不必考虑。
- 就是记笔记吧,类似nim的博弈,举例:$$k=3,n=4$$$$4堆石子分别是1、2、3、3$$全化为二进制$$01$$$$10$$$$11$$$$11$$然后每一位纵向加和,两位都是\(3\%(k+1)==0\),全能整除\((k+1)\)则后手胜,否则都是先手胜。PS:我只知道(k+1)应该与那个经典益智问题有关:共有若干火柴,每次最少拿1最多拿k,怎样先手必胜。
int n, m, k;
char s[105];
int ans, val[105];
bool flag1, flag2;
int main() {
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> m >> k;
rep(i, 1, n) {
cin >> s;
val[i] = -1;
int f1 = -1, f2 = -1, tmp = 0;
rep(j ,0, m - 1)
if (s[j] == 'G') f1 = j;
else if (s[j] == 'R') f2 = j;
else tmp++;
if (tmp == 0 || tmp == m) continue;
if (f1 >= 0 && f2 >= 0) {
val[i] = abs(f2 - f1) - 1;
} else if (f1 < 0) {
flag2 = 1;
} else flag1 = 1;
}
if (!flag1 && !flag2) {
int tmp[10] = {0};
rep(i, 1, n)
if (val[i] > 0) {
int cnt = 0;
for (int j = val[i]; j; j >>= 1)
tmp[cnt++] += j % 2;
}
rep(i, 0, 9)
if (tmp[i] % (k + 1) != 0) {
flag1 = 1;
}
cout << (flag1 ? "First\n" : "Second\n");
} else if (flag1 && flag2) {
cout << "Draw\n";
} else cout << (flag1 ? "First\n" : "Second\n");
return 0;
}
最新文章
- Intel VT入门
- shell在一个大文件找出想要的一段字符串操作技巧
- mac下删除svn账号
- 一些Demo链接
- UVa 10047,独轮车
- Undefined symbols for architecture armv7
- python 零散记录(四) 强调字典中的键值唯一性 字典的一些常用方法
- oracle2
- 网络库Alamofire使用方法学习笔记
- Delete 命令详解
- Visual Studio 2017 和 Visual Assist X 番茄助手的安装教程
- form表单提交到Servlet后,弹出对话框,然后在跳转页面
- 剑指offer(56)删除链表中重复的节点
- 【VBA研究】VBA自己定义函数參数类型不符的错误
- 上传图片JS插件Plupload
- ASP.NET SignalR Troubeshooting
- 【jdk源码1】TreeMap源码学习
- Linux 安装JDK Tomcat MySQL(使用Mac远程访问)
- 【android】模拟点击某个指定坐标作用在View上
- CodeForces - 1004C