您的位置:首页 > 其它

POJ 3276 Face The Right Way 反转

2016-11-24 17:11 393 查看

题目:

http://poj.org/problem?id=3276

题意:

n头牛站成一排,有的朝前有的朝后,每次可以选定一个长度为k的区间,把区间内的牛全部反向,问最少需要反转的次数和对应的k

思路:

参看挑战程序设计竞赛

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <set>
using namespace std;

const int N = 5010, INF = 0x3f3f3f3f;
int dir
, f
;
int n;
int work(int k)
{
memset(f, 0, sizeof f);
int res = 0, sum = 0;
for(int i = 1; i + k - 1 <= n; i++)
{
if((dir[i] + sum) & 1) res++, f[i] = 1;
sum += f[i];
if(i - k + 1 >= 1) sum -= f[i-k+1];
}
for(int i = n - k + 2; i <= n; i++)
{
if((dir[i] + sum) & 1) return -1;
if(i - k + 1 >= 1) sum -= f[i-k+1];
}
return res;
}
int main()
{
char ch;
while(~ scanf("%d", &n))
{
for(int i = 1; i <= n; i++)
{
scanf(" %c", &ch);
dir[i] = ch == 'F' ? 0 : 1;
}
int num = INF, k = 1;
for(int i = 1; i <= n; i++)
{
int tmp = work(i);
if(tmp >= 0 && num > tmp) num = tmp, k = i;
}
printf("%d %d\n", k, num);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: