目录
题目
单点时限: 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;
}