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 }