POJ 3276

尺取法和开关反转问题
这里最可以用暴力去递归发现时间复杂度大概为n^3左右。这显然会超时。
我们就用尺取法来取就好了。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<stack>
#include<vector>
#include<queue>
#include<set>
#include<map>
#define up(i,a,b)  for(int i=a;i<b;i++)
#define dw(i,a,b)  for(int i=a;i>b;i--)
#define upd(i,a,b) for(int i=a;i<=b;i++)
#define dwd(i,a,b) for(int i=a;i>=b;i--)
//#define local
typedef long long ll;
const double esp = 1e-6;
const double pi = acos(-1.0);
const long long INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int, int> pir;
int n;
int dir[5005];
int f[5005];
int solve(int k)
{
	memset(f, 0, sizeof(f));
	int res = 0;
	int sum = 0;
	upd(i, 0, n -k)
	{
		if ((sum+dir[i]) & 1)
		{
			res++;
			f[i] = 1;
		}
		sum += f[i];
		if (i - k+1 >= 0)
		{
			sum -= f[i - k+1];
		}
	}
	up(i, n - k + 1, n)
	{
		if ((dir[i] + sum) & 1)return -1;
		if(i-k+1>=0)
			sum -= f[i - k + 1];
	}
	return res;
}
int main()
{
	cin >> n;
	char c;
	up(i, 0, n)
	{
		cin >> c;
		if (c == 'B')
			dir[i] = 1;
		else dir[i] = 0;
	}
	int ans=n, t=1;
	upd(i, 1, n)
	{
		if (solve(i) == -1)continue;
		else
		{
			if (ans > solve(i))

			{
				ans = solve(i);
				t = i;
			}
		}
	}
	cout << t<<" "<< ans << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44019404/article/details/88597065