XTU online judge 1266 RGB

Description
你有r颗红球,g颗绿球,b颗蓝球,它们排成一个直线。你想它们按红绿蓝顺序分成三个颜色区域,你每次可以任意交换两个球的位置,请问至少需要交换多少次?

Input
每行输入一个字符串表示开始时球的序列,使用RGB分别表示红绿蓝三色球,字符串长度不超过10000。

Output
每行输出一个样例的结果。

Sample Input
RRGGBB
RGBRGB

Sample Output
0
2

解题思路:
统计R,G,B的出现次数,在0…R-1统计G,B的出现次数,记为R1,R2,在R…R+G-1统计R,B的出现次数,记为G1,G2,在R+G…length-1统计R,G的出现次数,记为B1,B2。

那么首先肯定是两个两个区间互相交换,R1,G1交换,R2,B1交 换和G2,B2交换。有可能交换不完,成为0…R-1还有’G’,R…R+G-1还有’B’,R+G…length-1还有’R’的情况,那对于每个未交换字符的需要交换2次。

#include<bits/stdc++.h>
using namespace std;

int main()
{
	char s[10001];
	while(~(scanf("%s",s)))
	{
		int length=strlen(s);
		int R=0,G=0,B=0;
		
		for(int i=0; i<length; i++)
		{
			if(s[i] == 'R') R++;
			else if(s[i] == 'G') G++;
			else B++;
		}
		//0~R-1 G,B
		int R1=0,R2=0;
		for(int i=0; i<R; i++)
		{
			if(s[i] == 'G') R1++;
			else if(s[i] == 'B') R2++;
		}
		//R~R+G-1 R,B
		int G1=0,G2=0;
		for(int i=R; i<R+G; i++)
		{
			if(s[i] == 'R') G1++;
			else if(s[i] == 'B') G2++;
		}
		//R+G~length-1 R,G
		int B1=0,B2=0;
		for(int i=R+G; i<length; i++)
		{
			if(s[i] == 'R') B1++;
			else if(s[i] == 'G') B2++;
		}
		
		int sum=0,temp=0;
		if(R1 && G1)
		{
			temp=min(R1,G1);
			sum += temp;
			R1  -= temp;
			G1  -= temp;
		}
		
		if(R2 && B1)
		{
			temp=min(R2,B1);
			sum += temp;
			R2  -= temp;
			B1  -= temp;
		}
		
		if(G2 && B2)
		{
			temp=min(G2,B2);
			sum += temp;
			G2	-= temp;
			B2	-= temp;
		}
		
		sum += (R1+R2+G1+G2+B1+B2)/3*2;
		cout<<sum<<endl;
	}
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值