Face The Right Way POJ 3276

對我這種弱智來說這可太難理解了

https://blog.csdn.net/qq_34374664/article/details/53028870

看理解了題解

這個sum我的理解是他不僅是個k長度尺子,也會記錄在長度爲k的【i,i+k】區間內,每個點翻轉的次數

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>

using namespace std;

int f[5050];
int dis[5050];
int n,am,ak;

int slove(int k)
{
	int res=0;
	int sum=0;
	memset(f,0,sizeof(f));
	for(int i=0;i<n-k+1;i++)
	{
		if((sum+dis[i])%2)
		{
			res++;
			sum++;
			f[i]=1;
		}
		if(i-k+1>=0)
			sum-=f[i-k+1];
	}
	for(int i=n-k+1;i<n;i++)
	{
		if((sum+dis[i])%2) return -1;
		if(i-k+1>=0)
			sum-=f[i-k+1];
	}
	return res;
}

int main()
{
	string s;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>s;
		if(s[0]=='B')
			dis[i]=1;
		else if(s[1]=='F')
			dis[i]=0;
	}/*
	for(int i=0;i<n;i++)
		cout<<dis[i]<<endl;*/
	am=n+1;
	for(int i=1;i<=n;i++)
	{
		int m=slove(i);
		if(m>=0&&m<am)
		{
			am=m;
			ak=i;
		}
		else if(m==am&&i<ak)
			ak=i;
	}
	cout<<ak<<" "<<am<<endl;
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章