直接正文:我是题目指路标
运用贪心的思想,当奶牛经过一个加油站的时候,将这个加油站的油量推进单调队列(由大到小)
题目所给的是加油站距离城镇的距离,我们将其转化为起点与加油站的距离,按与起点的距离由小到大将加油站排序
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 }