20-NUC-OJ-神奇的开关

神奇的开关

问题描述

实验室一众人都非常友好,大家有一天来到了一栋公寓。

这栋公寓非常奇特,所有的房间都在一侧,而且所有房间的总开关在外面

每个房间的内的开关都坏掉了。也就是说,住在房间里的人无法控制自己的开关。

这时候,zwt饿了,想要去偷吃烤冷面,但是又怕大家发现。所以他跑到外面,想把所有人的房间里灯全部关掉再去吃烤冷面。

但是这个总开关非常神奇,他每次会把一个房间及它之后的所有房间开关全部反转。

现在你已经知道了房间的数量n和每个房间的开关状态(1代表开启,0代表关闭)

请问zwt最少需要操作这个开关几次才能关闭所有开关?

形式化来说

给定长度为n的01序列,每次可以选取任意整数i,将i~n的所有位取反(即0变成1,1变成0),问最少几次操作之后可以得到全0序列。

/*

如果你要用getchar(),请注意

windows环境下的换行符为\r\n,linux环境的换行符为\n.

有些数据在Windows中生成,而在评测机Linux环境下评测。这种情况在字符串输入中非常常见。

*/

输入描述

第一行n(1<=n<=15,000,000)代表房间的数目

第二行长度为n的01序列s,其中表示第个房间的状态,(0为开灯,1为关灯)

输出描述

输出最少的操作次数

样例输入

6
011100

样例输出

2

#include<iostream>
#include<algorithm>
#include<set>
#include<vector>
#include<map>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
const int N = 1e7+5e6+10;
char s[N];
int main()
{
	int n;
	scanf("%d", &n);
	scanf("%s", &s);
	int cnt = 0;
	char last = s[0];
	if(s[0] == '1')
	{
		cnt++;
	}
	for(int i=1; i<n; i++)
	{
		if(s[i] != last)
			cnt++;
		last = s[i];	
	}
	printf("%d", cnt);
	return 0;
}

一道水题,需要注意的是,不能一个接一个的输入字符或者数字,那样会超时

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值