2017-9-3模拟赛T1 卡片(card)

题目



【题目描述】

lrb 喜欢玩卡牌。他手上现在有n张牌,每张牌的颜色为红绿蓝中的一种。现在他有两种操作。一是可以将两张任意位置的不同色的牌换成一张第三种颜色的牌;二是可以将任意位置的两张相同颜色的牌换成一张该颜色的牌。两个操作后都可以将生成的牌放到任意位置。现在他想知道,最后一张牌可能是什么颜色的。

【输入描述】

第一入一个n,表示卡牌数量。
第二行输入一个由’B’,’G’,’R’组成的长度为n的字符串,分别表示卡牌的颜色为蓝色、绿
色、红色中的一种。
【输出描述】
输出’B’,’G’,’R’中的若干个字母,按字典序输出。代表可能的最后一张牌的颜色。
【样例】

【数据范围】

对于100%的数据,n ≤ 200

题解



显然牌的顺序不会对答案造成影响,故记录每种牌出现的次数。

分几种情况讨论。

1.只有一种牌,答案就是这种牌。

2.有两种牌,这需要分情况讨论。设这两种牌的数量为A,B,剩下一种为C.(为方便讨论,A<=B)

a.A=B=1.显然结果为剩下那种牌。

b.A=1,B>1.这时可以通过操作2转换为a情况,也可以把A,B各一张换成C,这样结果也有可能是A。但显然A的数量最多为1,因此不可能剩下一张B(可以证明)。

c.A,B>1.此时,可以把A,B各一张转化为C,再利用操作2使A,B,C都只剩下1张。显然此时最后可能的牌三种都有可能。

3.有三种牌。这种情况同样可以转化成三种牌各剩一张,因此最后三种都有可能。

这题需要一堆if,编程复杂度较高。下面贴出一种做法,不保证写法最优。

-----------------我是分割线-----------------

 1 #define FileIO(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);
 2 #include <stdio.h>
 3 #define R 1
 4 #define G 2
 5 #define B 4
 6 #define check1(a,b,c,A,B,C) if(!a&&b==1) return A|(c>1?B:0);
 7 int n,r,g,b;
 8 char solve(int r,int g,int b) {
 9     if(!r&&!g) return B;
10     if(!r&&!b) return G;
11     if(!g&&!b) return R;
12     check1(r,g,b,R,G,B);
13     check1(r,b,g,R,B,G);
14     check1(g,r,b,G,R,B);
15     check1(g,b,r,G,B,R);
16     check1(b,r,g,B,R,G);
17     check1(b,g,r,B,G,R);
18     return R|G|B;
19 }
20 int main() {
21     FileIO("card");
22     char c;
23     scanf("%d",&n);
24     for(int i=0;i<n;++i) {
25         scanf(" %c",&c);
26         ++(c==‘R‘?r:c==‘G‘?g:b);
27     }
28     c=solve(r,g,b);
29     if(c&B) putchar(‘B‘);
30     if(c&G) putchar(‘G‘);
31     if(c&R) putchar(‘R‘);
32     return 0;
33 }

偷看一眼代码

完结撒花+%czhou~~~

.MyShiningWords { }

时间: 2024-10-11 16:38:25

2017-9-3模拟赛T1 卡片(card)的相关文章

2017/9/3模拟赛T1

题解:这题是一道判断题,分5种情况讨论,以下为了方便以ABC为例 ①若只有A,答案为A ②若A.B.C都有,答案为ABC ③若只有AB,答案为C ④若AAB式,答案为BC ⑤若只有A.B且AB均大等于2,答案为ABC 代码如下: 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int n,cnt[3],cur; 5 char a[205]; 6 bool pd(){ 7 for(int i=0;i&l

2017 11 6模拟赛T1

作为一个毒瘤出题人(wzy:我不是毒瘤出题人,这些题明明很水的),wzy的题干十分复杂,但是把题意简化之后,相当简单粗暴... 求首项为1,等比为m,项数为t的等比数列的和,答案对k取模 不保证m与k互质 如果m与k互质的话,用等比数列的求和公式在求个逆元就能解决了,但是本题显然不能,于是必须考虑不含有除法的算法 于是就有了分治求等比数列和的办法. 设s(x)为等比数列的第n项 由等比数列的性质得到s(y)=s(x)*m^(y-x) (y>x) 将一个长度为2r的等比数列拆分成登场的两部分,对应

2017 9 27 模拟赛T1

题意简述: 求1-n中所有数的k次方的和,答案对1234567891取模. 样例输入格式: 一行,两个整数n,k 样例输出格式: 一个整数,即所求的和. 数据范围:n<10^9,k<100 这道题n非常大,即使是O(n)的算法也不能承受,但是此题的k却非常小,这也就提醒由k入手. 首先预处理前k+1个数的k次方的和,如果n<=k+1的话其实就可以直接输出a[0][n]了,不过我觉得出题人不会出这样的数据. 为什么是k+1个数呢?这是为了能处理一些差分的问题. 然后不断地计算每一行的差分,

20180610模拟赛T1——脱离地牢

Description 在一个神秘的国度里,年轻的王子Paris与美丽的公主Helen在一起过着幸福的生活.他们都随身带有一块带磁性的阴阳魔法石,身居地狱的魔王Satan早就想着得到这两块石头了,只要把它们溶化,Satan就能吸收其精华大增自己的魔力.于是有一天他趁二人不留意,把他们带到了自己的地牢,分别困在了不同的地方.然后Satan念起了咒语,准备炼狱,界时二人都将葬身于这地牢里. 危险!Paris与Helen都知道了Satan的意图,他们要怎样才能打败魔王,脱离地牢呢?Paris想起了父王

2017-9-3 校内模拟T1卡片card

题意:有三种字母,可以用两个不同的换一个第三种字母,两个相同的换一个同种字母(即消去一个),问最后剩下的字母. 第一题显然是if题,总体来说只有三种情况: 1.有三种不同的>>输出"BGR" 2.有两种不同的:{ (1)两种都有超过一个>>情况1: (2)一种只有一个>>输出这种和未出现的字母 (3)两种都只有一个>>输出未出现的字母 }   3.只有一种字母>>输出这个字母 代码(极丑): 1 #include<ios

2017 7.22 模拟赛

最水的一次模拟赛.. 点击查看题目 T1 求最后K位  那前面的数是没有比要求的 , 我们就把 10k 作为模数 ,对答案进行取模 就好了  #include <ctype.h> #include <cstdio> #define N 100005 typedef long long LL; void read(LL &x) { x=0;bool f=0; register char ch=getchar(); for(;!isdigit(ch);ch=getchar())

2017 6 11模拟赛

盘子序列 [题目描述] 有 n 个盘子.盘子被生产出来后,被按照某种顺序摞在一起.初始盘堆中如果一 个盘子比所有它上面的盘子都大,那么它是安全的,否则它是危险的.称初始盘堆为 A,另外有一个开始为空的盘堆 B.为了掩盖失误,生产商会对盘子序列做一些“处 理” ,每次进行以下操作中的一个:(1)将 A 最上面的盘子放到 B 最上面:(2)将 B 最上 面的盘子给你. 在得到所有n个盘子之后, 你需要判断初始盘堆里是否有危险的盘子. [输入格式] 输入文件包含多组数据(不超过 10 组) 每组数据的

2017/9/29模拟赛

T1.多米诺骨牌(card)小 Z 最近买了很多很多的多米诺骨牌,他选出了其中的一些排成了一排,并且准备从右到左碰倒这些骨牌.每个骨牌有一个坐标 xi(>=1)和一个大小 yi(>=1),倒下时将会碰倒坐标区间位于[xi-yi,xi)内的所有骨牌.当然没有两个骨牌有相同的坐标, 并且小 Z 规定坐标大的更靠右.但是他发现他买的骨牌太巨了,所以在倒下的时候会将所有碰倒的骨牌破坏掉,被破坏掉的骨牌就无法使用了,并且不会倒下.得知这个消息的小 Z 十分惊讶,他想知道如果还按刚才这种方法从右到左碰倒所

2017/11/3模拟赛

块(block)[问题描述]拼图达人小 C 手里有 n 个 1*1 的正方形方块, 他希望把这些方块拼在一起, 使得拼出的图形周长最小, 要求方块不能重叠. 擅长拼图的小 C 一下就求出了这个周长, 顺便他想考考你会不会求.[输入格式]多组数据, 第一行一个正整数 T, 表示数据组数.接下来 T 行, 每行一个正整数 n, 表示方块数.[输出格式]输出 T 行, 每行一个正整数, 表示答案.[样例输入]3 4 1122[样例输出]81420[数据范围]对于 20%的数据, n<=20:对于 40