Atcoder beginner contest 124D Handstand

https://atcoder.jp/contests/abc124/tasks/abc124_d
题意:有一个由01组成的字符串,每次可以选一段,其中的01变成相反的。最多k次操作后,求连续的1的个数最多是多少。
思路:每次可以将连续一部分变相反。先统计出共有几部分,每一部分有相同数字组成,相邻两部分的数字不相同。可以发现每次最多取2k+1个组。然后枚举算一下最大的和是多少。细节处理一下就好。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define pii pair
#define mp make_pair
#define fi first
#define se second
#define inf 0x7fffffff
using namespace std;
string s;
vector<int> v;
int main()
{
	int i,j,k,n,m,x,y,la;
	scanf("%d%d",&n,&k);
	cin>>s;
	la=0;
	s+='*';
	if(s[0]=='0')
		v.push_back(0);
	for(i=1;i<=n;i++)
	{
		if(s[i]!=s[i-1])
		{
			v.push_back(i-la);
			la=i;
		}
	}
	if(s[n-1]=='0')
	{
		v.push_back(0);
	}
	int sum=0,ma;
	if(2*k+1>=v.size())
	{
		printf("%d",n);
		return 0;
	}
	for(i=0;i<2*k+1;i++)
	{
		sum+=v[i];
	}
	ma=sum;
	for(i=2*k+1;i<v.size();i+=2)
	{
		sum-=v[i-2*k-1];
		sum-=v[i-2*k];
		sum+=v[i];
		sum+=v[i+1];
		ma=max(ma,sum);
	}
	printf("%d",ma);
	return 0;
}

你可能感兴趣的:(atcoder)