题目
【题目描述】
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