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 }


 

转载于:https://www.cnblogs.com/qqky/p/7039528.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值