XTU online judge 1266 RGB

北单实体店微信:LYZZ336688 2024-04-20 10:37

Description

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

Input

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

Output

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

Sample Input

蓝球比分_蓝球火全集_蓝球

RRGGBB

RGBRGB

Sample Output

解题思路:

统计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
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;
	}
}

下一篇: 描写足球比赛的好句
上一篇: 中国足球
相关文章
返回顶部小火箭