您的位置:首页 > 运维架构

bzoj 1747: [Usaco2005 open]Expedition 探险 贪心

2016-11-11 08:03 381 查看

题意

一群奶牛抢了一辆卡车决定前往树林里探险.但是由于它们的驾驶技术太糟,油箱在路上给弄破了,所以它们每前进一个单位的路程就会漏掉一个单位的油,为了修好油箱,奶牛们必须前往最近的城市(不会超过1000000单位路程).在当前位置和城市之间有N(1≤N≤10000)个加油站.奶牛可以在加油站加1到100单位的油.对于人来说,树林是个危险的地方,对奶牛来说,更是这样.所以,奶牛要尽可能的少停站加油.幸运的是,这辆卡车的油箱非常大,你可以认为它的容量是无穷大的.卡车在离城P(1≤P≤1000000)个单位时还有L个单位的油. 你要算出奶牛们至少要停几站才能到城市,或者奶牛们根本到不了城市

分析

用优先队列维护经过的油站,如果到达不了某个地点则每次从优先队列中取出加油量最多的油站即可。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#define N 1000005
using namespace std;

priority_queue <int> q;
int n,l,p;
struct data{int dis,num;}a
;

bool cmp(data a,data b)
{
return a.dis<b.dis;
}

int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d%d",&a[i].dis,&a[i].num);
scanf("%d%d",&p,&l);
for (int i=1;i<=n;i++)
a[i].dis=p-a[i].dis;
sort(a+1,a+n+1,cmp);
a[++n].dis=p;a
.num=0;
int ans=0;
for (int i=1;i<=n;i++)
if (l>=a[i].dis) q.push(a[i].num);
else
{
while (!q.empty()&&l<a[i].dis)
{
l+=q.top();
q.pop();
ans++;
}
if (l>=a[i].dis) q.push(a[i].num);
}
if (l>=p) printf("%d",ans);
else printf("%d",-1);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: