#hihocoder #1135 : Magic Box

hihocoder #1135 : Magic Box

标签(空格分隔): hihocoder


1135 : Magic Box

Description

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.

Input

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.

Output

The maximum number of balls in the box ever.

Hint

Another Sample
Sample Input Sample Output
0 0 0
RBYRRBY 4

Sample Input

1 2 3
RRYBRBRYBRY
Sample Output
7

这道题比较简单,但是感觉自己的写法还是很繁琐,等两天再回过头来修正精简自己的代码吧。
主要思路就是用一个数组对输入的RYB进行计数,每读入一个新的字符后,判断是否达到“xyz”的条件,达到就置零,下次重新计数。置零前先判断是否为目前最大字符数,是就保留当前值。
因为Java是引用传递,因此new了很多数组出来,总感觉可以减少一些的…留待以后复习来思考吧…

import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;


public class Main {

public static void main(String[] args) {
Scanner sin = new Scanner(System.in);
while(sin.hasNext()) {
int maxN = 0;
int x = sin.nextInt();
int y = sin.nextInt();
int z = sin.nextInt();
int[] cmp = sortXYZ(x,y,z);
sin.nextLine();
char[] rby = sin.nextLine().toCharArray();
int[] cnt = new int[3];
for (int i = 0; i < rby.length; i++) {
switch (rby[i]) {
case 'B' : cnt[0]++; break;
case 'Y' : cnt[1]++; break;
case 'R' : cnt[2]++; break;
default:
}
int[] tmp = new int[3];
//tmp = cnt;
for (int k = 0; k < 3; k++) {
tmp[k] = cnt[k];
}
Arrays.sort(tmp);
int[] tmp2 = getDiff(tmp);

boolean flag = false;
for (int j = 0; j < tmp2.length; j++) {
if (tmp2[j] != cmp[j]) {
flag = true;
break;
}
}
if (cnt[0] + cnt[1] + cnt[2] > maxN) {
maxN = cnt[0] + cnt[1] + cnt[2];
}
if (!flag) {
cnt[0] = 0; cnt[1] = 0; cnt[2] = 0;
}
}
System.out.println(maxN);
}
}

private static int[] getDiff(int[] A) {
int[] ra = new int[3];
ra[0] = A[1] - A[0] > A[2] - A[1] ? A[2] - A[1] : A[1] - A[0];
ra[1] = A[1] - A[0] > A[2] - A[1] ? A[1] - A[0] : A[2] - A[1];
ra[2] = A[2] - A[0];
return ra;
}

private static int[] sortXYZ(int x, int y, int z) {
int[] tmpInt = new int[3];
tmpInt[0] = Math.min(x, Math.min(y, z));
tmpInt[2] = Math.max(x, Math.max(y, z));
tmpInt[1] = x + y + z - tmpInt[0] - tmpInt[2];
return tmpInt;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值