zoukankan      html  css  js  c++  java
  • coderforces719b

    题目大意:给定一个字符串,这个字符串中只有“r”和"b"组成,每次操作只能交换两个字符的位置或者将一个字符由"r"变"b"(或由"b"变"r").

    问:至少需要操作多少次才能使得字符串中rb依次存在(rbrbrbrb...或者brbrbrbr....)

    题解:交换所需要得次数肯定是小于字符变值,所以操作中优先考虑交换,然后才考虑改变字符值.所以用两个变量(rn,bn)依次记录下与标准字符串的差值

    对于每个字符串分别用brbr和rbrbrb的形式判断他们.然后每交换一次,rn与bn都要减少一次。等交换完毕,剩下的操作就是变值,所以总的操作数就是

    两个变量中差值大的那个。然后从两种变换中找出值最小的那个。

    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #define MAX_SIZE 100005
    using namespace std;
    char str[MAX_SIZE];
    int main()
     {
        int n = 0;
        int rn = 0, bn = 0;
        int cnt = 0;
        cin>>n;
        cin>>str;
    //rbrb switch to brbr,相当于把字符串变成brbr的形式
        for(int i = 0; i < n; i++)
        {
            if(i%2 == 0)
            {
                if(str[i] == 'r')
                rn++;
            }
            if(i%2 == 1)
            {
                if(str[i] == 'b')
                bn++;
            }
    
        }
        cnt = max(rn,bn);
    //brbr switch to rbrb,相当于把字符串变成rbrb的形式
        rn = bn = 0;
        for(int i = 0; i < n; i++)
        {
            if(i%2 == 1)
            {
                if(str[i] == 'r')
                rn++;
            }
            if(i%2 == 0)
            {
                if(str[i] == 'b')
                bn++;
            }
    
        }
        cout<<min(cnt,max(rn,bn))<<endl;
    
     }
  • 相关阅读:
    Java中try-catch-finally的一点理解
    子类继承父类的私有属性
    Java中的String[] args
    Java类和类成员的访问权限修饰符
    JAVA中抽象类与接口的区别
    Java C# .net 和 C C++ 跨平台的区别
    Java中的instanceof关键字
    深入理解JAVA的多态性[转]
    Linux文件系统的目录结构
    硬盘分区
  • 原文地址:https://www.cnblogs.com/wangkundentisy/p/5907689.html
Copyright © 2011-2022 走看看