题目链接
http://poj.org/problem?id=2431
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 9243 | Accepted: 2700 |
Description
Input
Output
Sample Input
4 4 4 5 2 11 5 15 10 25 10
Sample Output
2题目大意;
你需要驾驶卡车行驶L单位距离,一开始卡车有P单位的汽油,卡车每开1单位需要消耗1单位的汽油。如果在途中车上的汽油耗尽,卡车就无法继续前行。在途中一共有N个加油站。第i个加油站在距离终点Ai 单位距离的地方,最多可以给卡车加Bi单位的汽油,问卡车能否到达终点,如果可以最少需要加多少次汽油。
思路:
在到达加油站 i 时就获得了一次在之后的任何时候都可以加Bi 单位汽油的权利。因为希望到达终点时加油次数尽可能少,所以当燃料为0了之后再进行加油。在燃料为0时,应该选能加油量Bi最大的加油站。
代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int MAXN=10000+10;
struct point
{
int dis;
int val;
bool operator<(const point&a)const{
return val<a.val;
}
}a[MAXN];
bool cmp(const point &a,const point &b){
return a.dis<b.dis;
}
int main()
{
int n,p,l;
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].dis,&a[i].val);
scanf("%d%d",&l,&p);
for(int i=1;i<=n;i++)
a[i].dis=l-a[i].dis;
a[++n].dis=l;
a[0].dis=0;
sort(a,a+n,cmp);
priority_queue<point> q;
int cnt=0;
for(int i=1;i<=n;i++)
{
int d=a[i].dis-a[i-1].dis;
while(d>p){
if(q.empty()){
printf("-1\n");
goto end;
}
p+=q.top().val;
q.pop();
cnt++;
}
p-=d;
q.push(a[i]);
}
printf("%d\n",cnt);
end:;
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/sinat_30126425/article/details/47726491