Codeforce 719B

题目链接http://codeforces.com/problemset/problem/719/B

思路
不论输入什么,最终序列只有两种rbrbrb,brbrbr两种
找输入串和最终序列错位的个数,这些错位数一定要花费一次.
有两种组合,max(r[0],b[1])和max(r[1],b[0]);
max(r[0],b[1])表示rbrbrb这种序列的最大错位数,即花费次数
max(r[1],b[0])表示brbrbr这种序列的最大错位数。
以题目中样例1举例:

5
rbbrr

核心代码

rep(i,0,n)
    {
        if(s[i]=='r')
            r[i&1]++;
        if(s[i]=='b')
            b[i&1]++;
    }
int ans=min(max(b[0],r[1]),max(b[1],r[0]));

case1:
最终序列rbrbr
输入序列rbbrr
r[0]表示i为偶数(i&1==0),s[i]==r
b[1]表示i为奇数(i&1==1), s[i]==b

r[0]=1; //输入序列的第四个错位
b[0]=1;//输入序列的第三个错位
max(r[0],b[1])=1;

case2:
最终序列brbrb
输入序列rbbrr
r[1]表示i为奇数(i&1==1),s[i]==r
b[0]表示i为偶数(i&1==0), s[i]==b

r[0]=2; //输入序列的第四个错位
b[0]=1;//输入序列的第三个错位
max(r[0],b[1])=2;

ans=min( …. , …. )求两种case较小的次数

完整代码

#include
#include
#include
#define  rep(i,a,b)  for(i=a;i
using namespace std;
char s[100010];
int r[2],b[2];
int main(){
    int i,n;
    scanf("%d",&n);
    scanf("%s",s);
    rep(i,0,n)
    {
        if(s[i]=='r')
            r[i&1]++;
        if(s[i]=='b')
            b[i&1]++;
    }
    int ans=min(max(b[0],r[1]),max(b[1],r[0]));
    printf("%d\n",ans);
    return 0;
} 

你可能感兴趣的:(水题)