神奇的开关
问题描述
实验室一众人都非常友好,大家有一天来到了一栋公寓。
这栋公寓非常奇特,所有的房间都在一侧,而且所有房间的总开关在外面
每个房间的内的开关都坏掉了。也就是说,住在房间里的人无法控制自己的开关。
这时候,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;
}
一道水题,需要注意的是,不能一个接一个的输入字符或者数字,那样会超时