2167: 翻转卡片
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 120 Solved: 41
Submit Status Web Board
Description
DML有n张卡片排成一个序列.每张卡片一面是黑色的,另一面是白色的。初始状态的时候有些卡片是黑色朝上,有些卡片是白色朝上。DML现在想要把一些卡片翻过来,得到一种交替排列的形式,即每对相邻卡片的颜色都是不一样的。DML想知道最少需要翻转多少张卡片可以变成交替排列的形式。
Input
输入数据有多组,每组输入包括一个字符串S,字符串长度length(3 ≤ length ≤ 50),其中只包含'W'和'B'两种字符串,分别表示白色和黑色。整个字符串表示卡片序列的初始状态。
Output
输出一个整数,表示DML最少需要翻转的次数。
Sample Input
BWBB
Sample Output
1
题解:
分别枚举第一个字母改变和不改变的需要翻牌的情况,取最小值
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string s,s1,s2;
char change(char c){
if(c=='B') c='W';
else c='B';
return c;
}
int main(){
while(cin>>s){
int ans=0,minn=0x3ffffff;
s1=s;
s2=s;
//第一个字母不变
for(int i=1;i<s1.size();i++){
if(s1[i]==s1[i-1]){
s1[i]=change(s1[i]);
ans++;
}
}
// cout<<s1<<endl;
minn = min(minn,ans);
//第一个字母改变
ans=1;
s2[0] = change(s2[0]);
for(int i=1;i<s2.size();i++){
if(s2[i]==s2[i-1]){
s2[i]=change(s2[i]);
ans++;
}
}
// cout<<s2<<endl;
minn = min(minn,ans);
cout<<minn<<endl;
}
return 0;
}