题目描述
有很多个硬币摆在一行,有正面朝上的,也有背面朝上的。正面朝上的用 11 表示,背面朝上的用 00 表示。
现在要求从这行的第一个硬币开始,将从第一个硬币开始的前若干个硬币同时翻面,求如果要将所有硬币翻到正面朝上,最少要进行这样的操作多少次?
输入格式
一个字符串,由 00 和 11 组成,表示硬币的初始状态。
输出格式
一个整数,表示要翻转的最少次数。
输入输出样例
输入 #1复制
10
输出 #1复制
2
说明/提示
样例解释
- 第 11 次翻转:把第一个硬币翻到反面,字符串为 0000;
- 第 22 次翻转:把第一、二个硬币一起翻到正面,字符串为 1111,翻转完成,输出 22。
数据范围
记 n 表示硬币的总个数,
- 对于 20%20% 的数据,1≤n≤10;
- 对于 50%50% 的数据,1≤n≤104;
- 对于 100%100% 的数据,1≤n≤106。
#include<iostream> #include<cstring> using namespace std; const int N = 1e6 + 10; char str[N]; int sum; int main() { cin >> str; int len = strlen(str); for (int i = 0; str[i]; i++) { if (str[i] != str[i + 1]) //如果出现不一样的就翻转一次 { sum++; } } if (str[len - 1] == '1') //因为上面比较最后一次的时候是与str[len]比较的,一定不一样, cout << sum - 1 << endl; //即一定会翻转一次,但如果最后一个属是1的话,实际上是不需要翻转的,所以要减去1 else cout << sum << endl; return 0; }
算法小白的刷题日记--字符串,直接秒了哈哈