UVa 11489 整数游戏

https://vjudge.net/problem/UVA-11489

题意:

给出一个数字串n,两个人轮流从中取出一个数字,要求每次取完之后剩下的数是3的倍数,不能取数者输。

思路:

要想取掉一个数后总和还是的倍数,那么取掉的数必须得是3的倍数。

分两种情况:

①数字串总和为3的倍数,此时只需要看数字串中3的倍数的个数,奇数个的话先手赢,否则后手赢。

②数字串总和不为3,那么它会余1or余2,如果余1,那么查看数字串中是否存在%3后余1的数,如果有,则转化成了①情况,否则先手就输。(同理分析余2)

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<queue>
 7 #include<cmath>
 8 using namespace std;
 9
10 char s[1005];
11
12 int main()
13 {
14     int T;
15     scanf("%d",&T);
16     int kase=0;
17     while(T--)
18     {
19
20         cin>>s;
21         int sum=0;
22         int num_0=0,num_1=0,num_2=0;
23         int len=strlen(s);
24         printf("Case %d: ",++kase);
25         for(int i=0;i<len;i++)
26         {
27             if((s[i]-‘0‘)%3==0)  num_0++;
28             else if((s[i]-‘0‘)%3==1)  num_1++;
29             else if((s[i]-‘0‘)%3==2)  num_2++;
30             sum+=s[i]-‘0‘;
31         }
32         if(sum%3==0)
33         {
34             if(num_0%2)   printf("S\n");
35             else  printf("T\n");
36         }
37         else
38         {
39             if(sum%3==1)
40             {
41                 if(num_1 && num_0%2==0)  printf("S\n");
42                 else   printf("T\n");
43             }
44             else if(sum%3==2)
45             {
46                 if(num_2 && num_0%2==0)  printf("S\n");
47                 else   printf("T\n");
48             }
49         }
50     }
51     return 0;
52 }
时间: 2024-10-28 15:12:20

UVa 11489 整数游戏的相关文章

Uva 11489 - Integer Game

Two players, S and T, are playing a game where they make alternate moves. S plays first. In this game, they start with an integer N. In each move, a player removes one digit from the integer and passes the resulting number to the other player. The ga

UVa 10891 Sum游戏

https://vjudge.net/problem/UVA-10891 题意: 有一个长度为n的整数序列,两个游戏者A和B轮流取数,A先取.每次玩家只能从左端或者右端取任意数量个数,但不能两端都取.所有数都被取走后游戏结束,然后统计每个人取走的所有数之和,作为各自的得分.两个人采取的策略都是让自己的得分尽量高,并且两个人都足够聪明,求A的得分减去B的得分后的结果. 思路: 不管是轮到谁取数,都是在一个序列中从左边或右边开始取最大值. 那么我们就令d[i][j]表示先手在[i~j]序列中所能取到

UVa 1610 聚会游戏

https://vjudge.net/problem/UVA-1610 题意:输入一个n个字符串的集合D,找一个长度最短的字符串S,使得D中恰好有一半串小于等于S,另一半串大于S. 思路:先拍序,然后选择中间的两个,比较他们就可以了.可以用枚举法来比较. 1 #include<string> 2 #include<iostream> 3 #include<algorithm> 4 using namespace std; 5 6 const int maxn = 100

UVa 10935卡片游戏

很简单的一个题目,就是队列的运用就可以了,就是注意一下1的时候的情况就可以了. 1 #include<iostream> 2 #include<queue> 3 using namespace std; 4 5 int main() 6 { 7 queue<int> s; 8 int n,t; 9 while (cin >> n && n) 10 { 11 for (int i = 1; i <= n; i++) 12 { 13 s.p

UVA 11489 Integer Game (博弈)

1227: Integer Game Time Limit: 1 Sec  Memory Limit:128 MB Submit: 9  Solved: 4 [Submit][Status][Web Board] Description Two players, S and T, are playing a game where they make alternate moves. S plays first. In this game, they start with an integer N

uva 10891 sum游戏(区间dp)

 给定n个数字,A和B可以从这串数字的两端任意选数字,一次只能从一端选取.并且A B都尽力使自己选择的结果为最大的,可以理解成A B每一步走的都是最优的.如果A先选择,则A B差值最大是多少. 思路:用d[i][j]表示当前选手先手走能获得的最大总分数,由于总的分数是一定的,那么状态转移方程为 d[i][j] = sum(i, j) - min( minleft(i+1, j), minright(i, j-1), 0) 其中minleft(i, j)表示min(d[i][j], d[i+1

UVa 1343 旋转游戏(dfs+IDA*)

https://vjudge.net/problem/UVA-1343 题意:如图所示,一共有8个1,8个2和8个3,如何以最少的移动来使得中间8个格子都为同一个数. 思路:状态空间搜索问题. 用IDA*算法的话会比较快,而且代码比较简洁. IDA*的关键就是要寻找一个估价函数h(),在这道题目中,每次移动最多只会使一个格子的数字正确,所以当maxd-d<h()时便可以剪枝. 1 #include<iostream> 2 #include<string> 3 #include

[SinGuLaRiTy] 贪心题目复习

[SinGuLaRiTy-1024] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. [POJ 2709] 颜料 (Painter) 题目描述 杂货店出售一种由N(3<=N<=12)种不同颜色的颜料,每种一瓶(50ML),组成的颜料套装.你现在需要使用这N种颜料:不但如此,你还需要一定数量的灰色颜料.杂货店从来不出售灰色颜料——也就是它不属于这N种之一.幸运的是,灰色颜料是比较好配置的,如果你取出三种不同颜色的颜料各x ml,混合起来就

Integer Game(UVA11489)3的倍数

K - Integer Game Time Limit:1000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 11489 题意:在n中取数字,使剩下的数是3的倍数,不能取则失败. 思路:如果能使当前数为3的倍数,数字和必是3的倍数.要保持这种状态,先对每一位对3取余,统计cnt[0],cnt[1],cnt[2]; 的个数,整个串能否被3整除取决于ans=(cnt[1]+cnt[