9.3noip模拟赛第一题卡片

卡片 (card)
【题目描述】
lrb 喜欢玩卡牌。他手上现在有n张牌,每张牌的颜色为红绿蓝中的一种。现在他有两种
操作。一是可以将两张任意位置的不同色的牌换成一张第三种颜色的牌;二是可以将任意位
置的两张相同颜色的牌换成一张该颜色的牌。两个操作后都可以将生成的牌放到任意位置。
现在他想知道,最后一张牌可能是什么颜色的。
【输入描述】
第一入一个n,表示卡牌数量。
第二行输入一个由’B’,’G’,’R’组成的长度为n的字符串,分别表示卡牌的颜色为蓝色、绿
色、红色中的一种。
【输出描述】
输出’B’,’G’,’R’中的若干个字母,按字典序输出。代表可能的最后一张牌的颜色。
【样例】
输入 1 输出 1
2
RB
G
输入 2 输出 2
3
GRG
BR
输入 3 输出 3
4
BBBB
B
【数据范围】
对于100%的数据,n ≤ 200

思路:用if各种特殊判断

#include<cstdio>
using namespace std;
int n,a,b,c;
int a1,b1,c1;
char ch[210];
int main(){
  scanf("%d",&n);
  scanf("%s",ch);
  for(int i=0;i<n;i++)
  switch(ch[i]){
    case 'B':a++;break;
    case 'G':b++;break;
    case 'R':c++;break;
  }
  if(a&&!b&&!c){//如果只存在B,则只输B
    printf("B");
    return 0;
  }
  if(!a&&b&&!c){//同
    printf("G");
    return 0;
  }
  if(!a&&!b&&c){//同
    printf("R");
    return 0;
  }
  if(n==2){ //如果有两个且不同
    if (!a) printf("B");
    if (!b) printf("G");
    if (!c) printf("R");
    return 0;
  }
  if(a==n-1){//可论证
    printf("GR");
    return 0;
  }
  if(b==n-1){
    printf("BR");
    return 0;
  }
  if(c==n-1){
    printf("BG");
    return 0;
  }
  printf("BGR");
  return 0;
}

论证:

如果有n-1个B,另一个为R,

1、消去B直到剩下一个B,BR为G

2、一个B和R成G,在消去B,BG为R

3、因为同一次只能出现一个R或G,所以永远不会全都是B

所以答案为RG

同理的另外两个

 

posted @ 2017-09-03 22:16  tsharry  阅读(204)  评论(0编辑  收藏  举报