codeforces373B+Anatoly and Cockroaches+贪心

Anatoly lives in the university dorm as many other students do. As you know, cockroaches are also living there together with students. Cockroaches might be of two colors: black and red. There are n cockroaches living in Anatoly’s room.

Anatoly just made all his cockroaches to form a single line. As he is a perfectionist, he would like the colors of cockroaches in the line to alternate. He has a can of black paint and a can of red paint. In one turn he can either swap any two cockroaches, or take any single cockroach and change it’s color.

Help Anatoly find out the minimum number of turns he needs to make the colors of cockroaches in the line alternate.
Input

The first line of the input contains a single integer n (1 ≤ n ≤ 100 000) — the number of cockroaches.

The second line contains a string of length n, consisting of characters ‘b’ and ‘r’ that denote black cockroach and red cockroach respectively.
Output

Print one integer — the minimum number of moves Anatoly has to perform in order to make the colors of cockroaches in the line to alternate.
Examples
Input

5
rbbrr

Output

1

Input

5
bbbbb

Output

2

Input

3
rbr

Output

0

Note

In the first sample, Anatoly has to swap third and fourth cockroaches. He needs 1 turn to do this.

In the second sample, the optimum answer is to paint the second and the fourth cockroaches red. This requires 2 turns.

In the third sample, the colors of cockroaches in the line are alternating already, thus the answer is 0.
有一堆巧克力,我要让它的颜色交替的出现。有两种方法:1,交换任意两快,2替换某一块。问最小的操作步数。
10101010101类似于这样的串,奇数位上需要是1,偶数位上需要是0,那么我们可以记录奇数位上不是1的个数x,偶数位上不是0的个数y.当然可以想到交换次数越多,总的交换次数越少。。所以对于串,我们最多可进行的交换次数就是min(x,y)..那么需要替换的次数也可以知道了。max(x,y)-min(x,y)。所以总的次数就是max(x,y)
最后对01010110这中串再做一次,找出两个中最小的,就是答案。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define MOD 1000000007
#define inf 0x3f3f3f3f
int n;
char a[100005];
int cnt1(){ //rbrbrbrb
    int r=0,b=0;
    int len=strlen(a);
    for(int i=0;i<len;i++){
        if(i%2==0&&a[i]!='r') r++;
        else if(i%2==1&&a[i]!='b') b++;
    }
    return max(r,b);
}
int cnt2(){ //brbrbrb
    int r=0,b=0;
    int len=strlen(a);
    for(int i=0;i<len;i++){
        if(i%2==0&&a[i]!='b') b++;
        else if(i%2==1&&a[i]!='r') r++;
    }
    return max(r,b);
}
int main(){
    int n;
    scanf("%d",&n);
    scanf("%s",a);

    int ans=inf;
    ans=min(ans,cnt1());
    ans=min(ans,cnt2());
    printf("%d\n",ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值