白皮书《挑战程序设计》74页
一般像考虑多重因素,涉及到最远距离之类的大部分会用到优先队列思想
想到优先队列后,我们就考虑到,车走到一定位置,前面加油站都放入队列中,加入我此时想加油,我是要拿最近的还是油量最大的,显然根据题意要拿油量最大的,加好油后车辆继续前行,这途中继续将加油站放入队列中
好,思路大致就是这样。但这类题一般都有很多岔路口需另算。
车走到一定位置用flag来记录
何时想加油,下一站距离大于车油,那么我是否只加一个加油站,答案是不一定,要用while
拿油时如果队列中为空,那么肯定到不了下一站
for(){
while(){
if()
}
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <set>
#include<cmath>
#include<queue>
using namespace std;
const int N = 550;
typedef long long ll;
bool st[N];
int dp[N][N],dis[N];
int a[N],b[N];
int n,l,p,ans;
int x,y,flag;
const int inf = 0x3f3f3f3f;
vector<int> vec;
int solve(){
cin>>n>>l>>p;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
priority_queue<int> q;
for(int i=1;i<=n;i++){
int d = a[i] - flag;
while((d-p)>0){
if(!q.empty()){
int adds = q.top();
q.pop();
p+=adds;
ans++;
}
else return -1;
}
d=a[i];
q.push(b[i]);
}
return ans;
}
int main()
{ cout<<solve();
return 0;
}
/*4 25 10
10 14 20 21
10 5 2 4
2*/