• 1、黑白卡片--全国模拟(四)


    [编程题] 黑白卡片
    时间限制:1秒
    空间限制:32768K
    牛牛有n张卡片排成一个序列.每张卡片一面是黑色的,另一面是白色的。初始状态的时候有些卡片是黑色朝上,有些卡片是白色朝上。牛牛现在想要把一些卡片翻过来,得到一种交替排列的形式,即每对相邻卡片的颜色都是不一样的。牛牛想知道最少需要翻转多少张卡片可以变成交替排列的形式。 
    输入描述:
    输入包括一个字符串S,字符串长度length(3 ≤ length ≤ 50),其中只包含'W'和'B'两种字符串,分别表示白色和黑色。整个字符串表示卡片序列的初始状态。
     
     
    输出描述:
    输出一个整数,表示牛牛最多需要翻转的次数。
     
    输入例子:
    BBBW
     
    输出例子:
    1
     
    解题思路:考虑与左侧第一个不变为基准找,和以右侧第一个不变为基准找,然后求count最小值
     1 #include <iostream>
     2 using namespace std;
     3 int main()
     4 {
     5     string s;
     6     while(cin>>s)
     7     {
     8         int length  = s.size();
     9         cout<<length<<endl;
    10         int count1 = 0;//左侧为基准开始算的数目
    11         int count2 = 0;//右侧为基准开始算的数目
    12         char temp1 = s[0];
    13         char temp2 = s[length-1];
    14         for(int i=1;i<length;i++)
    15         {
    16             if(s[i] != temp1)
    17             {
    18                 temp1 = s[i];
    19             }
    20             else
    21             {
    22                 count1++;
    23                 if(s[i] == 'W')
    24                 {
    25                     temp1 = 'B';
    26                 }
    27                 else
    28                 {
    29                    temp1 = 'W';
    30                 }
    31             }
    32         }
    33         for(int i=length-2;i>=0;i--)
    34         {
    35             if(s[i] != temp1)
    36             {
    37                 temp1 = s[i];
    38             }
    39             else
    40             {
    41                 count2++;
    42                 if(s[i] == 'W')
    43                 {
    44                     temp1 = 'B';
    45                 }
    46                 else
    47                 {
    48                    temp1 = 'W';
    49                 }
    50             }
    51         }
    52         if(count1>count2)
    53         {
    54             cout<<count2<<endl;
    55         }
    56         else
    57         {
    58             cout<<count1<<endl;
    59         }
    60     }
    61     return 0;
    62  
    63 }
    只过了60%,改思路存在问题,不一定,左侧第一个或者右侧第一个一定不变
    正确解题思路:最后排好的字符串是以BW开头或者以WB开头,分别计算一遍,求最小的count即可
     1 #include <iostream>
     2 using namespace std;
     3 int main()
     4 {
     5     string s;
     6     while(cin>>s)
     7     {
     8         int length  = s.size();
     9         int count1 = 0;//左侧为BW开始算的数目
    10         int count2 = 0;//左侧为WB开始算的数目
    11         for(int i=0;i<length;i++)
    12         {
    13             if(i%2 == 0)
    14             {
    15                 if(s[i] != 'B')
    16                 {
    17                     count1++;
    18                 }
    19             }
    20             else
    21             {
    22                 if(s[i] != 'W')
    23                 {
    24                     count1++;
    25                 }
    26             }
    27         }
    28         for(int i=0;i<length;i++)
    29         {
    30             if(i%2 == 0)
    31             {
    32                 if(s[i] != 'W')
    33                 {
    34                     count2++;
    35                 }
    36             }
    37             else
    38             {
    39                 if(s[i] != 'B')
    40                 {
    41                     count2++;
    42                 }
    43             }
    44         }
    45         if(count1>count2)
    46         {
    47             cout<<count2<<endl;
    48         }
    49         else
    50         {
    51             cout<<count1<<endl;
    52         }
    53     }
    54     return 0;
    55  
    56 }


     

  • 相关阅读:
    【splunk】数据输入-文件目录 导入失败
    【linux】tar压缩不包含路径
    【python】已安装模块提示ImportError: No module named
    【splunk】用正则表达式提取字段
    【python】xsspider零碎知识点
    【scrapy】资料
    【splunk】一些查询例子
    【docker】将容器中数据拷贝到主机
    【linux】ubuntu下crontab无效解决方法
    Flink – metrics V1.2
  • 原文地址:https://www.cnblogs.com/qqky/p/7039528.html
Copyright © 2020-2023  润新知