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

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

思路:

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

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

 

  下面是代码:

 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的, 不禁百感交集, 感觉这半年来并没有怎么提升啊。 果然还是不够“刻意练习”!!!

 POJ 2431 (优先队列) 算法

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄