Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 9795 | Accepted: 2842 |
Description
Input
Output
Sample Input
4 4 4 5 2 11 5 15 10 25 10
Sample Output
2
Hint
Drive 10 units, stop to acquire 10 more units of fuel, drive 4 more units, stop to acquire 5 more units of fuel, then drive to the town.
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
#include<stdlib.h>
#include<string>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#define L(a,b,c) for(int a = b;a >= c;a --)
#define M(a,b,c) for(int a = b;a <= c;a ++)
#define N(a,b) memset(a,b,sizeof(a));
#define MAXX(a,b) ((a)>(b)?a:b)
#define MINN(a,b) ((a)<(b)?a:b)
const int MAX=1<<30;
const int MIN=-MAX;
using namespace std;
struct data
{
int x; ///距离
int y; ///油量
} a[10010];
int comp(data a,data b) ///从小到大排序
{
return a.x<b.x;
}
int L,P,n;
void solve()
{
priority_queue<int>que;
///pos表示上一个站点的位置,tank表示当前油量,ans表示加油次数
int pos=0,tank=P,ans=0;
for(int i = 0; i < n; i ++)
{
int d=a[i].x-pos; ///表示到此加油站需要行驶的距离
while(tank-d<0) ///此时不能到达下一个加油点
{
if(que.empty()) ///队列中没有元素,则证明不能到达终点
{
printf("-1\n");
return ;
}
///若有元素,则进行输入
tank+=que.top();
que.pop();
++ans;
}
tank-=d; ///到下一个加油点剩余的油量
///对下一种情况进行输入
pos=a[i].x;
que.push(a[i].y);
}
printf("%d\n",ans);
}
int main()
{
while(~scanf("%d",&n))
{
N(a,0)
for(int i = 0; i < n; i ++)
scanf("%d%d",&a[i].x,&a[i].y);
scanf("%d%d",&L,&P);
for(int i = 0; i < n; i ++) ///转化为加油站到起点的距离
a[i].x = L - a[i].x;
///对n点转化为加油站,便于计算
a[n].x=L;
a[n].y=0;
n ++;
sort(a,a+n,comp); ///对所有距离从小到大排序
///输入距离和开始油量
solve();
}
return 0;
}