NKOJ6584 涂瓷砖
|
问题描述
孙老师家正在装修,他买了N块可以自己涂色的瓷砖,昨天孙老师回家发现热心的装修师傅在未经他同意的情况下,擅自给瓷砖涂上了颜色,N块瓷砖在地上是排成一列的,它们的颜色可以用长度为N的字符串S来表示,S由0和1构成,0代表瓷砖被涂成了黑色,1代表被涂成了白色。孙老师想重新上色,使得相邻两块不是同一颜色。请问他至少要重新涂几块瓷砖? 已知:1<=|S|<=100000,S[i]要么是0,要么是1。
输入格式
输入字符串S
输出格式
输出孙老师至少要重新涂几块瓷砖才能使得相邻两块不是同一颜色。
样例输入 1
000
样例输出 1
1
样例输入 2
10010010
样例输出 2
3
样例输入 3
0
样例输出 3
0
这道题是一道经典的字符串问题
首先我们得知道字符串的求长度函数length()(是人都知道好吧)
可能大家第一感的思路是这样的:
把三个相邻的字符拿来比较,如果相同就修改掉中间的那个字符,否则就继续往下比较
但是不用这么想,我们可以用一个更简单的思路:
把两个相邻的相邻的字符拿来比较,如果相同,就修改掉第二个字符,否则就继续往下比较
于是我们就可以用下面的代码来实现。
参考代码:
#include<bits/stdc++.h>
using namespace std;
string s;
int cnt=0; //存储要修改的瓷砖数量
int main(){
cin>>s; //字符串最好用cin,用scanf容易爆掉
if(s.length()==1){ //如果位数为1就直接输出0,然后结束程序
cout<<0;
return 0;
}
for(int i=0;i<s.length()-1;i++){ //比较到字符串S的前一位
if(s[i]-'0'==s[i+1]-'0'){ //判断相邻两个瓷砖颜色是否相同
cnt++; //相同则需修改瓷砖数自增1
if(s[i]-'0'==0&&s[i+1]-'0'==0) //如果两个瓷砖都是黑色,则第二个瓷砖修改为白色
s[i+1]='1';
else //否则修改为黑色
s[i+1]='0';
}
}
cout<<cnt; //同样,用printf容易爆掉
return 0;
}
awa