Codeforces 392 B Blown Garland

题意:输入是由连续的RYGB和字符!组成的字符串,R代表红灯,Y代表黄灯,G代表绿灯,B代表蓝灯。简而言之,就是给定的字符串保证了下标对4取余相同的灯颜色都相同,但是有的地方为‘!’代表这个灯坏了,然后分别输出坏了的红、蓝、黄、绿灯的数量。

分析:因为下标对4取余相同的灯颜色都相同,所以确定了前四个灯的颜色,后面的灯都是前四个灯颜色的不断循环,两个map映射一下就可以了。

#include<bits/stdc++.h>
#define Min(a, b) ((a < b) ? a : b)
#define Max(a, b) ((a < b) ? b : a)
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const double eps = 1e-8;
const int MAXN = 100 + 10;
const int MAXT = 500 + 10;
using namespace std;
char s[MAXN];
map<int, char> mp;
map<char, int> ma;
int a[5];
int main(){
    ma['R'] = 0;
    ma['B'] = 1;
    ma['Y'] = 2;
    ma['G'] = 3;
    while(scanf("%s", s) == 1){
        mp.clear();
        memset(a, 0, sizeof a);
        int len = strlen(s);
        for(int i = 0; i < len; ++i){//确定前四个灯的颜色
            if(i % 4 == 0 && s[i] != '!'){
                mp[0] = s[i];
            }
            if(i % 4 == 1 && s[i] != '!'){
                mp[1] = s[i];
            }
            if(i % 4 == 2 && s[i] != '!'){
                mp[2] = s[i];
            }
            if(i % 4 == 3 && s[i] != '!'){
                mp[3] = s[i];
            }
        }
        for(int i = 0; i < len; ++i){
            if(s[i] == '!'){
                int t = i % 4;
                char c = mp[t];//每个坏了的灯分别是什么颜色,并统计个数
                ++a[ma[c]];
            }
        }
        printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]);
    }
    return 0;
}

 

posted @ 2017-01-20 13:48  Somnuspoppy  阅读(263)  评论(0编辑  收藏  举报