UVA 11489 Integer Game(博弈,规律)
2015-07-02 10:16
218 查看
题意:给出一段长度不超过1000位的数字, 两个人进行游戏, 分别从数字中去掉某一位数字, 并且去掉之后, 剩下的数字的每一位数相加都是3的倍数, 最后不能取, 或是没有数字了, 就输了. 先手胜利的话就输出"S", 否则输出"T".
在中间过程中,取前是满足sum%3=0的,取后也要满足sum%3=0,所以取的数字一定是3的倍数(包含0),这一个步骤可以推广至从第二步到最后一步,第一步则要具体分析:如果sum%3=1,那么要想赢就得取某一位上mod(3)等于1的数字,没有的话就输了;如果sum%3=2,那么要想赢就得取某一位上mod(3)等于2的数字,没有的话就输了;那么如果sum%3=0,那么要想赢就得取某一位上mod(3)等于0的数字,没有的话就输了。最后针对步骤可以得到结论:step%2==1先手赢,否则后手赢。
在中间过程中,取前是满足sum%3=0的,取后也要满足sum%3=0,所以取的数字一定是3的倍数(包含0),这一个步骤可以推广至从第二步到最后一步,第一步则要具体分析:如果sum%3=1,那么要想赢就得取某一位上mod(3)等于1的数字,没有的话就输了;如果sum%3=2,那么要想赢就得取某一位上mod(3)等于2的数字,没有的话就输了;那么如果sum%3=0,那么要想赢就得取某一位上mod(3)等于0的数字,没有的话就输了。最后针对步骤可以得到结论:step%2==1先手赢,否则后手赢。
#include <iostream> #include<cstdio> #include<cstring> using namespace std; int n,i,j; char s[1005]; int dit[3]; int main(int argc, char *argv[]) { //freopen("cin.txt","r",stdin); while(cin>>n){ for(i=1;i<=n;i++){ scanf("%s",s); memset(dit,0,sizeof(dit)); int length=strlen(s),sum=0; for(j=0;j<length;j++){ int q=s[j]-48; sum+=q; dit[q%3]++; } int step=0; if(dit[sum%3]){ step++; dit[sum%3]--; } if(step)step+=dit[0]; //有了第一步才有后面的步骤 if(step%2)printf("Case %d: S\n",i); else printf("Case %d: T\n",i); } } return 0; }
相关文章推荐
- Android studio第一次使用配置(三)gradle项目构建
- MasterCAM二次开发(一)
- C# MongoDB 操作
- PHP上传文件限制的大小
- 转:HashMap深度解析(一)
- IPHONE目录说明
- Android 开发系列 2 Activity
- MFC 获取分辨率
- PHP.ini安全配置检测工具pcc简单介绍
- 甲骨文终获Java编程语言版权
- Spring MVC 文件下载 - 兼容IE
- 【c语言】模拟实现strchr函数,功能:在一个字符串中查找一个字符第一次出现的位置,如果没有出现返回NULL
- 分享一个链接
- Office打开时出现配置进度条
- 零基础免费搭建个人博客-hexo+github
- 为什么我不推荐大家去外包公司
- Java中都通用文件下载(ContentType、文件头、response、out四步骤)
- 网络基础(2)--通信过程之一HTTP协议
- 自定义ActionBar 左边距为0
- linux下mysql数据库的导入导出