洛谷P2882
P2882 [USACO07MAR] Face The Right Way G
好难啊~
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int main() {
int n; cin >> n;
vector<int> a(n + 1), flip(n + 2);
//a记录原状态,flip用作差分记录对应牛的翻转次数
for(int i = 1; i <= n; i++) {
char c; cin >> c;
a[i] = (c == 'B') ? 1 : 0;
}
int min_k = 1, min_ops = n + 1;
//最大值假设所有牛都需要翻转,每次翻转一头牛
for(int k = 1; k <= n; k++) {
memset(&flip[0], 0, sizeof(int) * (n + 2));
//每次翻转长度变化时,重组差分翻转数组
int ops = 0, sum = 0;
bool valid = 1;
for(int i = 1; i <= n; i++) {
sum += flip[i];//差分求a_i实际翻转次数
if((a[i] + sum) % 2 != 0) {//当a_i朝后
if(i + k - 1 > n) {
valid = 0;
break;
}
//若当前到队尾未满k头牛则无法翻转
ops++;
flip[i]++;
flip[i + k]--;
sum++;
//能翻转就更新状态
}
}
if(valid && ops < min_ops) {
min_ops = ops;
min_k = k;
}
//更新答案
}
cout << min_k << ' ' << min_ops << '\n';
return 0;
}

浙公网安备 33010602011771号