老司机garden (20 分)

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;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值