要点

  • 不难发现问题转化成: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;
}

最新文章

  1. Intel VT入门
  2. shell在一个大文件找出想要的一段字符串操作技巧
  3. mac下删除svn账号
  4. 一些Demo链接
  5. UVa 10047,独轮车
  6. Undefined symbols for architecture armv7
  7. python 零散记录(四) 强调字典中的键值唯一性 字典的一些常用方法
  8. oracle2
  9. 网络库Alamofire使用方法学习笔记
  10. Delete 命令详解
  11. Visual Studio 2017 和 Visual Assist X 番茄助手的安装教程
  12. form表单提交到Servlet后,弹出对话框,然后在跳转页面
  13. 剑指offer(56)删除链表中重复的节点
  14. 【VBA研究】VBA自己定义函数參数类型不符的错误
  15. 上传图片JS插件Plupload
  16. ASP.NET SignalR Troubeshooting
  17. 【jdk源码1】TreeMap源码学习
  18. Linux 安装JDK Tomcat MySQL(使用Mac远程访问)
  19. 【android】模拟点击某个指定坐标作用在View上
  20. CodeForces - 1004C

热门文章

  1. telnet- Linux必学的60个命令
  2. linq学习(第二部分)
  3. Android开发 WebView的详解
  4. 关于JAVA项目中CLASSPATH路径详解
  5. golang和python的二进制转换
  6. centos6 php7 安装 memcache 和 memcached
  7. ROC曲线及AUC
  8. 微信开发SDK支持小程序 ,Jeewx-Api 1.3.1 版本发布
  9. python学习笔记3.3_json解析
  10. ORC格式hive逻辑中case when问题