今日北单推荐_单场推荐_北京单场推荐【竞彩足球推荐】
62 2025-04-25
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;
}
}