列表

详情


NC16261. 合唱队形

描述

铁子的班级在毕业晚会有一个合唱节目,到了毕业晚会的时候,他们必须排成一排一起合唱"认错","当然是选择原谅他"等一系列原谅歌曲,但是当队形布置好的时候,领导们觉得队形里最长的连续的女生的长度太小了,但是由于马上要开始演唱,所以最多只能两个人交换位置,问新队形中最长的连续的女生的长度是多少?

输入描述

第一行一个数字n表示铁子班级的总人数。1≤n≤105
第二行一个字符串s表示最初的队形布置,si=0表示第i个人是女生,si=1表示第i个人是男生。

输出描述

输出一行表示答案

示例1

输入:

6
101010

输出:

3

说明:

将第6个女生和第3个男生交换位置可以满足要求

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 8ms, 内存消耗: 848K, 提交时间: 2020-04-06 15:51:33

#include<bits/stdc++.h>
using namespace std;
char ch[100005];
int f[100005];
int main(void)
{
    int n;
    cin>>n;
    cin>>ch;
    int k=0,sum=0;
    for(int i=0;i<n;i++){
        if(ch[i]=='0'){sum++;f[k]++;}
        else k++;
    }
    int ans=0;
    for(int i=1;i<=k;i++)
        ans=max(ans,f[i]+f[i-1]);
    if(sum==n||sum==ans)cout<<sum;
    else cout<<ans+1;
}




C++11(clang++ 3.9) 解法, 执行用时: 7ms, 内存消耗: 1000K, 提交时间: 2020-02-28 21:42:50

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int i,j,t=0,n,S[100005]={0};
	char R[100005];
	scanf("%d%s",&n,R+1);
	for(i=1;i<=n;i++)
	S[i]=S[i-1]+(R[i]-'0'?0:1);
	for(i=j=1;i<=j&&j<=n;)
	{
		if(j-i<S[n]&&j-i-S[j]+S[i-1]<1)
		{
			if(t<j-i+1) t=j-i+1;
			j++;
		}
		else i++;
	}
	printf("%d\n",t);
	return 0;
}

上一题