思路:直接翻转就行了,找出最优方案
#include <cstdio>
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
const int MAX = 1e5+10;
const int INF = 1e6;
using namespace std;
int N;
int dir[MAX];//牛的方向
int f[MAX];//牛 i 是否反转过
//判断K是否能够处理
int Calc(int K){
int sum = 0;
int res = 0;
memset(f, 0, sizeof(f));
for(int i=0; i+K<=N; i++){
if((dir[i]+sum) % 2 != 0){
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 !=0)
return -1;
if(i-K+1 >= 0){
sum -= f[i-K+1];
}
}
return res;
}
void Solve(){
int K = 1;
int ans = INF;
f