NKOJ6584 涂瓷砖

NKOJ6584           涂瓷砖

时间限制 : 2000 MS   空间限制 : 1048576 KB

问题描述

孙老师家正在装修,他买了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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值