garden不仅是世界第一首富,还是一个老司机。在圣诞前夕,他购买了一座小岛以及一辆用于在小岛上行驶的汽车。garden有一套新的冬季轮胎,允许他在任何平均空气温度下安全驾驶不超过k天。在使用k天后(不管这些天的温度),冬季轮胎的磨损严重,不能再行驶。这些k天不必形成连续的天数段。 在第一个冬天之前,garden仍然使用夏季轮胎。当平均空气温度为非负时,可以用夏季轮胎安全行驶任何天数。当平均空气温度为负时,不能继续用夏季轮胎行驶。garden可以在任何一天开始时将夏季轮胎更换为冬季轮胎,反之亦然。 garden在多次的行驶中,发现了一个有趣的问题,即更换最小次数的轮胎,能不能安全行驶为n天,如果能,输出最小更换的次数,否则,输出-1。
第一行包含两个正整数n和k(1≤n≤20000,0≤k≤n) 表示总天数n和冬季轮胎的可以使用天数k。允许在任何温度下开冬季轮胎,但总共不超过k天。
输出garden最少需要更换几次轮胎,如果不可能行驶完所有天数,请输出-1。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=200001;
int a[maxn];
int n,k,sum;
int dfs(int po,int num,int kk,int state){
if(kk<0) return 0;
if(po==n) {
sum=min(sum,num);
return 0;
}
else {
if(a[po]<0&&state) dfs(po+1,num,kk-1,1);
else if(a[po]<0&&!state) dfs(po+1,num+1,kk-1,1);
else if(a[po]>=0&&!state) dfs(po+1,num,kk,0);
else {
dfs(po+1,num+1,kk,0);
dfs(po+1,num,kk-1,1);
}
}
}
int main(){
while(cin>>n>>k){
sum=n;
int fu=0;
for(int i=0;i<n;i++){
cin>>a[i];
if(a[i]<0) fu++;
}
dfs(0,0,k,0);
if(k<fu) cout<<"-1"<<endl;
else cout<<sum<<endl;
}
return 0;
}