一.小知识点
1.c++自带min/max函数
a.求a,b中较小/大的元素
b.求数组中的最小/大元素
1> C=max('a','z');
2> C = max(A); //求数组A的最大元素
3> C = max(A, B); //要求数组A和数组B的长度相同,返回一个与之等长的数组,其值为A,B每个位置的最大值
2.不间断地输入字符串:
char a[111];
while(scanf("%s",a)!=EOF){ ... }
3.区别: i=0;j=i+1(注意要以 j 来判断循环退出条件!!(因为以i很容易让j数组下标越界))
双重循环有两个变量:元素中的每一个都要和其它元素比较。
单重循环有两个变量:第一个和第二个比较、第二个和第三个比较...
4.这题模拟,不用实质交换!
二.题目
三.代码
#include <bits/stdc++.h>
using namespace std;
char a[11111];
int main()
{
while(scanf("%s",a)!=EOF){
int r=0,g=0,b=0,i,j,k,result=0;
int r1=0,r2=0,g1=0,g2=0,b1=0,b2=0;//记录r,g,b三个区域分别有多少个另外的两个字母
int rg=0,rb=0,gb=0;分别记录r,g,b三个区域的交换次数
int n=strlen(a);
for(i=0;i<n;i++){//确定r,g,b三个区域的大小
if(a[i]=='R') r++;
else if(a[i]=='G') g++;
else if(a[i]=='B') b++;
}
for(i=0;i<r;i++){//计算三个区域分别有多少个另外的两个字母
if(a[i]=='G') r1++;
else if(a[i]=='B') r2++;
}
for(i=r;i<r+g;i++){
if(a[i]=='R') g1++;
else if(a[i]=='B') g2++;
}
for(i=r+g;i<n;i++){
if(a[i]=='R') b1++;
else if(a[i]=='G') b2++;
}
rg=min(r1,g1);
rb=min(r2,b1);
gb=min(b2,g2);
result=rg+rb+gb;
int re1=r-rg-rb;//把r区中交换过的r减去
int re2=r-g1-b1;//把r区中剩下的r减去
printf("%d\n",result+(re1-re2)*2);
}
return 0;
}