2021-04-10

牛客练习赛80

比赛地址:https://ac.nowcoder.com/acm/contest/11170/A

题目大意:给一个有01构成的串,你可以对该串进行一次操作——对任意一个位置的字符进行反转,也就是把1变成0把0变成1,最后输出该串最少有多少连在一起的全部由1组成的字串

思路;要求由连续的1组成的字串的数量很简单,扫描一遍就可以了,这里有个小技巧,就是在字符串的最前面加一个0这样只要有arr[i]==0&&arr[i+1]==1就加一,然后考虑到有可能反转一个字符后会造成数量减一,分析一下如果反转后数量减一无非存在两种情况一种是000010000这种或者111111101111这种,所以我们只要扫描到aba这种型号的字串就说明反转后数量会减一,这里和前面一样我们在最后在一个字符0处理0000001这种特殊情况。

下面看代码:

#include <iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char arr[1000006];
int main()
{
    int ans=0,flag=0,len;
    scanf("%s",arr+1);
    arr[0]='0';
    len=strlen(arr);
    arr[len++]='0';
    for(int i=1;i<len-1;i++)
    {
        if(arr[i]=='1'&&arr[i-1]=='0')
        {
            ans++;
        }
        if(arr[i-1]==arr[i+1]&&arr[i]!=arr[i-1])
        {
            flag=1;
        }
    }
    cout<<ans-flag<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值