题解 洛谷SP348 【EXPEDI - Expedition】 贪心

直接正文:我是题目指路标

运用贪心的思想,当奶牛经过一个加油站的时候,将这个加油站的油量推进单调队列(由大到小)

题目所给的是加油站距离城镇的距离,我们将其转化为起点与加油站的距离,按与起点的距离由小到大将加油站排序

1     for(int i=0;i<n;i++)
2         s[i].dis=l-s[i].dis;

当货车的油不够支持到下一个加油站的时候,我们加上队首的点,也就是经过的加油站里油量最多的那一个。认为我们当初在那里加过油。

这里我们把城镇也当做一个油量为零,距离为l的加油站。

 1 #include<bits/stdc++.h> 
 2 using namespace std;
 3 int const MAX = 1e4 + 5;
 4 struct Stop
 5 {
 6     int dis,fuel;
 7 }s[MAX];
 8 bool cmp(Stop a, Stop b)
 9 {
10     return a.dis<b.dis;
11 }
12 int m;
13 int main()
14 {
15     cin>>m;
16     for(int k=1;k<=m;k++)
17     {
18     memset(s,0,sizeof(s));
19     bool f=true;
20     int n, l, p;
21     scanf("%d",&n);
22     for(int i=0;i<n;i++)
23         scanf("%d%d",&s[i].dis,&s[i].fuel);
24     scanf("%d%d",&l,&p);
25     for(int i=0;i<n;i++)
26         s[i].dis=l-s[i].dis; 
27     s[n].fuel=0;//将城镇当做一个加油站
28     s[n].dis=l;
29     n++; 
30     sort(s,s+n,cmp);
31     priority_queue <int> q;
32     int ans = 0, pos = 0, num = p;//num车剩下的汽油,pos上一个加油站距起点的距离 
33     for(int i = 0; i < n; i++)
34     {
35         int d=s[i].dis-pos;//从上一个加油站到这个加油站的距离 
36         while(num < d)
37         {
38             if(q.empty())
39             {
40                 printf("-1\n");
41                 f=false;
42                 break;
43             }
44             ans++;     //加油
45             num+=q.top();
46             q.pop();
47         }
48         if(f==false) break;
49         num-=d;   
50         q.push(s[i].fuel);
51         pos=s[i].dis;
52     }
53      if(f==true)  printf("%d\n",ans);
54    }
55 }
还是点加号

 

转载于:https://www.cnblogs.com/cheng-qing/p/9791609.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值