【2020牛客NOIP赛前集训营-普及组(第五场)】交换

来源:牛客网

题目描述

给一个长度为 n 的 01 序列 s[1],s[2],…,s[n],现在可以至多进行 1 次如下操作:
选择 1 ≤ x < n 1\leq x < n 1x<n,将 s 序列变成 s[x+1],s[x+2],…s[n],s[1],s[2],…s[x]

输出最长的全为 1 的子区间长度。

输入描述:

一个 01 字符串,表示序列 s。(1<= |s| <= 100000)

输出描述:

输出一个整数表示答案。

示例1
输入
1001
输出
2
示例2
输入
11111
输出
5
示例3
输入
10111010
输出
3

解题思路

0 + 一串1 + 0
不管怎样操作,1串都无法和别的1串接在一起

一次操作的意义就是把开头的 一串1 + 0 和结尾的 0 + 一串1 接在一起


Code
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

string s;
int ans, x, y, sum;

int main(){
    cin>>s;
    while (s[x] == '1')
         x++, y++;//x记录到第几位, y记录开头的1串
    for (; x < s.size(); x++)
    {
        sum = 0;
        while (s[x] == '1')
            x++, sum++;
        ans = max (ans, sum);
    }
    ans = max(ans,sum + y);//sum最终会记录结尾的1串 加上开头的1串(一次操作)
    printf ("%d", ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值