题意:
现在有 N 个牛站一排, 给你每个牛的方向。
你现在每次只能反转连续 K 个牛的方向,问把所有牛反转到面向前方
所需要的最少操作次数 M, 以及 K的值。
分析:
每次反转一个区间后, 如果左端的牛方向真确, 我们便不去考虑这个牛了。
故从左到右扫一边即可, 枚举K的值, 整个复杂度
O(N2);
Code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 131;
int N, dir[maxn];
int f[maxn];
int calc(int K) {
memset(f, 0, sizeof(f));
int res = 0;
int sum = 0;
for(int i = 0; i + K <= N; ++i) {
if((dir[i]+sum) % 2) {
res++; f[i] = 1;
}
sum += f[i];
if(i-K+1 >= 0) {
sum -= f[i-K+1];
}
}
//判断
for(int i = N-K+1; i <N; ++i) {
if((dir[i]+sum)%2) {
return -1;
}
if(i-K+1 >= 0) {
sum -= f[i-K+1];
}
}
return res;
}
void Solve() {
int K = 1, M = N;
for(int k = 1; k <= N; ++k) {
int m = calc(k);
if(m >= 0 && M > m) {
M = m;
K = k;
}
}
printf("%d %d\n", K, M);
}
int main() {
while(scanf("%d",&N)!=EOF) {
for(int i = 0; i < N; ++i) {
char c[5];
scanf("%s",c);
if(c[0] == 'B') dir[i] = 1;
else dir[i] = 0;
}
Solve();
}
return 0;
}