码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-09-04 22:34:04      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:turn   height   1.5   col   freopen   ini   return   位置   相同   

 题目


 【题目描述】

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~~~

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

标签:turn   height   1.5   col   freopen   ini   return   位置   相同   

原文地址:http://www.cnblogs.com/hotwords/p/7475764.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!