【2020.10.27 牛客 普及组 模拟赛5】T2 交换

57 篇文章 0 订阅
16 篇文章 0 订阅

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

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


输入描述:
一个 01 字符串,表示序列 s。 ( 1 < = ∣ s ∣ < = 100000 ) (1<= |s| <= 100000) (1<=s<=100000)

输出描述:
输出一个整数表示答案。


示例1

输入
1001

输出
2

示例2

输入
11111

输出
5

示例3

输入
10111010

输出
3


解题思路
选择是否将字符串中前一段移到末尾,求最长地连续‘1’的长度,很明显这段拼接不会影响中间连续1的长度。所以最长的连续‘1’的长度为 max(中间连续‘1’的长度,首尾连续‘1’长度的和)。

PS:如果首尾连续字符‘1’的长度和超过字符串的长度,答案只取字符串的长度。


代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<cmath>
using namespace std;
string s;
int k,t,ans,lyx;
int main(){
	cin>>s;
	ans=-1;
	for(int i=0;i<s.size();i++)
	{
		if(s[i]=='0'&&t!=0)
		{
			ans=max(ans,t);
			t=0;
		}
		else if(s[i]=='1') t++;
	}
	ans=max(ans,t);
	for(int i=0;i<s.size();i++)
		if(s[i]=='0')
		{
			lyx+=i-0;
			break;
		 } 
	if(lyx==s.size())
	{
		printf("%d",ans);
		return 0;
	}
	for(int i=s.size()-1;i>0;i--)
		if(s[i]=='0')
		{
			lyx+=s.size()-i-1;
			break;
		 } 
	printf("%d",max(ans,lyx));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值