hihoCoder Magic Box

这是一道关于计算魔术箱中颜色球最大数量的题目。当红色(R)、黄色(Y)、蓝色(B)球之间的数量差达到特定值(x, y, z)时,所有球会消失。给定x, y, z和放球的顺序,任务是找出球的最大数量。例如,x=1, y=2, z=3,球序列为RRYBRBR,前7个球会使球全部消失,最大数量为7。" 212361,33076,维基百科编辑指南:wiki标记与页面编辑,"['wiki编辑', 'HTML表格', '页面格式', '链接', '图像处理']
摘要由CSDN通过智能技术生成

题目

题目1 : Magic Box
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
The circus clown Sunny has a magic box. When the circus is performing, Sunny puts some balls into the box one by one. The balls are in three colors: red(R), yellow(Y) and blue(B). Let Cr, Cy, Cb denote the numbers of red, yellow, blue balls in the box. Whenever the differences among Cr, Cy, Cb happen to be x, y, z, all balls in the box vanish. Given x, y, z and the sequence in which Sunny put the balls, you are to find what is the maximum number of balls in the box ever.

For example, let’s assume x=1, y=2, z=3 and the sequence is RRYBRBRYBRY. After Sunny puts the first 7 balls, RRYBRBR, into the box, Cr, Cy, Cb are 4, 1, 2 respectively. The differences are exactly 1, 2, 3. (|Cr-Cy|=3, |Cy-Cb|=1, |Cb-Cr|=2) Then all the 7 balls vanish. Finally there are 4 balls in the box, after Sunny puts the remaining balls. So the box contains 7 balls at most, after Sunny puts the first 7 balls and before they vanish.

输入
Line 1: x y z

Line 2: the sequence consisting of only three characters ‘R’, ‘Y’ and ‘B’.

For 30% data, the length of the sequence is no more than 200.

For 100% data, the length of the sequence is no more than 20,000, 0 <= x, y, z <= 20.

输出
The maximum number of balls in the box ever.

提示
Another Sample

Sample Input Sample Output
0 0 0
RBYRRBY 4

样例输入
1 2 3
RRYBRBRYBRY
样例输出
7

分析

说说isMatch函数的实现吧,就是判断x,y,z和|Cr-Cy|=3, |Cy-Cb|=1, |Cb-Cr|=2是否match的函数。目前是都放到vector里面,然后排序,这样就可以直接比较了。也有个思路,就是放到两个set里面,然后遍历set,对比对应的元素。因为set内部实现是红黑树,所以遍历的时候是有序的。

代码

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool isMatch(int cr, int cy, int cb, int x, int y, int z){
    int xx = cr - cy;
    int yy = cr - cb;
    int zz = cy - cb;
    xx = xx > 0 ? xx : -xx;
    yy = yy > 0 ? yy : -yy;
    zz = zz > 0 ? zz : -zz;
    vector<int> cc;
    cc.push_back(xx);
    cc.push_back(yy);
    cc.push_back(zz);
    sort(cc.begin(), cc.end());
    vector<int> xyz;
    xyz.push_back(x);
    xyz.push_back(y);
    xyz.push_back(z);
    sort(xyz.begin(), xyz.end());
    return cc[1] == xyz[1] && cc[2] == xyz[2] && cc[0] == xyz[0];
}
int main(){
    int x, y, z;
    string str;
    cin >> x >> y >> z;
    cin >> str;
    int len = str.length();
    int cr = 0, cy = 0, cb = 0;
    int ans = 0;
    for(int i = 0; i < len; i++){
        if(str.at(i) == 'Y'){
            cy++;
        }
        else if(str.at(i) == 'R'){
            cr++;
        }
        else{
            cb++;
        }
        ans = max(ans, cr+cy+cb);
        if(isMatch(cr, cy, cb, x, y, z)){
            cr = 0;
            cy = 0;
            cb = 0;
        }
    }
    cout << ans;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值