其他分享
首页 > 其他分享> > POJ 2431 (优先队列)

POJ 2431 (优先队列)

作者:互联网

题目链接:https://vjudge.net/problem/POJ-2431

 

思路:

  “ 在卡车行驶途中, 只有经过加油站才能加油。” 我们不妨转变思路, 理解成“当卡车驶过加油站时就获得了加油的权利”,在之后需要加油时, 就认为是在之前经过加油站时加的油即可。

  那么我们何时加油呢, 最好的办法当然是选择能加最多油的加油站了(选择一次加大量的油, 可以减少加油次数),这时就要用到优先队列了。 

 

  下面是代码:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <queue>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 struct gas
 8 {
 9     int dis;
10     int fule;
11 }a[10005];
12 
13 bool cmp(gas A, gas B)
14 {
15     return A.dis<B.dis;
16 }
17 
18 priority_queue<int> que; 
19 
20 int main()
21 {
22     int n,L,P;
23     cin>>n;
24     for(int i=0; i<n; i++)
25     {
26         cin>>a[i].dis>>a[i].fule;
27     }
28     cin>>L>>P;
29     for(int i=0; i<n; i++)
30     {
31         a[i].dis = L-a[i].dis;
32     }
33     sort(a, a+n, cmp);
34     a[n].dis=L;
35     a[n].fule=0;
36     n++;//关键 
37     int position=0, count=0, tank=P;//所在位置, 加油次数, 剩余油量 
38     for(int i=0; i<n; i++)
39     {
40         int d=a[i].dis - position;
41         while(tank-d<0)
42         {
43             if(que.empty())
44             {
45                 puts("-1");
46                 return 0;
47             }
48             tank += que.top();//加油
49             que.pop();
50             count++; 
51         }
52         tank -= d;
53         position = a[i].dis;
54         que.push(a[i].fule);//关键 
55     }
56     cout<<count<<endl;
57     
58     return 0;
59 }

注释中的两个关键点要注意, 自己慢慢体会吧。

 

 题外话:

  最近比赛被吊打, 所以准备重新系统性学习。 看到这题是七个月前AC的, 不禁百感交集, 感觉这半年来并没有怎么提升啊。 果然还是不够“刻意练习”!!!

 

标签:加油,加油站,队列,2431,gas,int,POJ,include,dis
来源: https://www.cnblogs.com/watsoncao/p/10633023.html