【ECNU】20. Ms. Weasel eats chicken(C++)

该问题是一个关于路径规划和成本优化的算法题。黄鼠狼姐姐从小镇0开始,经过一系列小镇,每个小镇有特定的体力消耗和鸡的价格。目标是最小化购买鸡的总花费以维持体力。使用优先队列策略,先消耗完体力后再回溯寻找便宜的鸡。如果无法完成旅程,则输出-1。
摘要由CSDN通过智能技术生成

目录

题目

输入格式

输出格式

样例

思路

代码


题目

单点时限: 2.0 sec

内存限制: 256 MB

黄鼠狼姐姐将要踏上一段旅程。她事先规划好了她的旅行线路,因此她知道她将从小镇 0 出发,途径小镇 1,2…n−1,最终到达小镇 n。

出发时,黄鼠狼姐姐的体力值为 S。在从小镇 i−1 前往小镇 i 的路途当中,她会消耗体力 wi。

到达小镇 i 后,她可以在这个小镇的饭馆吃一些鸡来恢复体力。由于近几年经济不景气,外加东方神秘力量(据说是鸡年)的影响,每个小镇都只能供应 1 只鸡,并使黄鼠狼姐姐恢复 x 点体力。每个小镇鸡的价格是不同的:小镇 i 中每只鸡的价格为 Pi。

黄鼠狼姐姐希望花费尽可能少的钱走完整个旅程。如果黄鼠狼姐姐在某一时刻体力值小于 0,她会饿死在半路上。

输入格式

不超过 50 组测试数据。对于每组数据:

第一行三个整数:n (1≤n≤105), S (0≤S≤109), x (1≤x≤104)。

第二行 n 个整数,表示 wi (0≤wi≤104)。

第三行 n 个整数,表示 Pi (0≤Pi≤104)。

输出格式

输出黄鼠狼姐姐最少要花多少钱。如果她一定会饿死在半路上,输出 −1。

样例

input

5 3 1
2 1 3 4 5
1 1 1 1 1
5 3 1
1 1 1 1 1
1 2 3 4 5

output

-1
3

思路

难度评级:⭐️

黄鼠狼先一直向前走,走到没体力了,再回头看看,找较为便宜的几个小镇买鸡补充体力,如此往复;

依然是用优先队列去实现找较为便宜的小镇。

代码

#include <iostream>
#include <vector> 
#include <queue>

using namespace std;
typedef long long ll;

int main(int argc, char** argv) {
	ll n,s,x;// n-小镇个数;s-黄鼠狼当前的体力值;x-吃一次鸡可以补充的体力值
	while(cin>>n>>s>>x) {
		ll sum=0;// sum-花费的价格 
		
		vector<ll> w(n),p(n);// w-到达某个小镇时所需要消耗的体力;p-某个小镇鸡的单价
		for(ll i=0;i<n;i++) cin>>w[i];
		for(ll i=0;i<n;i++) cin>>p[i]; 
		
		priority_queue<ll,vector<ll>,greater<ll>> q;
		bool flag=true;
		for(ll i=0;i<n;i++) {
			s-=w[i];
			// 要从前面路过的小镇中选择较便宜的几个地方买鸡补充体力
			while(s<0&&!q.empty()) {
				sum+=q.top();
				q.pop();
				s+=x; 
			}
			if(s<0) {
				flag=false;
				break;
			}
			q.push(p[i]);
		}
		if(flag) cout<<sum<<endl;
		else cout<<-1<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值