洛谷 2708 硬币翻转 特判? 解题报告

来源:互联网 发布:模拟退火算法题目应用 编辑:程序博客网 时间:2024/06/10 20:15

题目背景

难度系数:☆☆☆☆☆(如果你看懂了)

题目描述

从前有很多个硬币摆在一行,有正面朝上的,也有背面朝上的。正面朝上的用1表示,背面朝上的用0表示。现在要求从这行的第一个硬币开始,将n个硬币(1<=n<=硬币个数)一起翻面,问如果要将所有硬币翻到正面朝上,最少要进行这样的操作多少次?

输入输出格式

输入格式:

一个字符串(当然不限长度,在字符串范围之内),有0和1组成

输出格式:

要翻转的最少次数

输入输出样例

输入样例#1:

10

输出样例#1:

2

说明

样例1说明:

第1次翻转:把第一个硬币翻到反面,字符串为00

第2次翻转:把第一、二个硬币一起翻到正面,字符串为11,翻转完成,输出2

思路

除了开头是0只加上1,其他的就是0的块块数量*2。。。

好贪心啊表示这不是BFS题吗哈哈哈。。。

被我给水过了哈哈。。。

代码

很清真

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>using namespace std;const int N=1e6+5;char s[N];int n,num[N],pos,tot=0; int main(){    scanf("%s",s+1);    n=strlen(s+1);    for (int i=1;i<=n;i++)    num[i]=s[i]-'0';    int flag=0,now=0;    if (num[n]==0) tot++;    if (num[1]==0) now=1;    for (int i=1;i<=n;i++)    {        if (num[i]==0) flag=1;        if (flag==1&&num[i]==1) {flag=0;tot++;}    }    printf("%d\n",tot*2-now);    return 0;}//10001001
原创粉丝点击