标签:
我要翻译题目!!!
/*
/*
思路:在路程不变的情况下,要让加油的次数最少,就必须每次尽量多得加油。在计划加油站点的时候,如果发现现在的油量无法使他们到达下一站时,就在前面出现过的可加油量最多的加油站进行加油。这样就不会出现在下一站无法到达的情况。于是可以使用优先队列进行运算。
*/
1 #include <cstdio> 2 #include <algorithm> 3 #include <queue> 4 #define max_n 10000+5 5 using namespace std; 6 7 struct dis_fuel{ 8 int dis; 9 int fuel; 10 };
/*
cmp(定义两个空指针,const void *a,const void *b)
强制转换两个空指针为dis_fuel型,并指向结构体中的结构成员dis。若a>b,则返回1,若a<b则返回-1,进行升序处理。
*/ 11 int cmp(const void *a, const void *b){ 12 return *(dis_fuel *a).dis > *(dis_fuel *b) ? 1 : -1;15 } 16 int main() 17 { 18 //建立优先队列 19 priority_queue <int> que; 20 21 struct dis_fuel AB[max_n]; 22 23 int num,A[max_n],B[max_n],L,P; 24 scanf("%d",&num); 25 26 for(int i = 0;i < num;i++){ 27 scanf("%d %d",&A[i],&B[i]); 28 } 29 scanf("%d %d",&L,&P); 30 31 for(int i = 0;i < num;i++){ 32 AB[i].dis = L - A[i]; 33 AB[i].fuel = B[i]; 34 }
/*
用qsort进行对结构体进行排序。格式为 qsort(结构数组名,数组的个数,数组元素的内存所占空间,函数名);
*/ 35 qsort(AB,num,sizeof(AB[0]),cmp); 36 37 AB[num].dis = L; 38 AB[num].fuel = 0; 39 num++; 40 41 int tank = P,pos = 0,ans = 0,dis_; 42 /*
在for循环里面对每一个每个currently ponit 进行遍历。如果当前的油量不能保持他走到下一站,则停下来进行加油。此时的油量是前面出现加油站提供的油量的最大 值。如果能,则继续走,并把每个加油站能提供的油量放进优先队列里面。
*/
43 for(int i = 0;i < num;i++){ 44 dis_ = AB[i].dis - pos; 45 46 while(dis_ > tank){ 47 if(que.empty()){ 48 printf("-1\n"); 49 return 0; 50 } 51 tank += que.top(); 52 que.pop(); 53 ans++; 54 } 55 56 tank -= dis_; 57 pos = AB[i].dis; 58 que.push(AB[i].fuel); 59 } 60 61 printf("%d\n",ans); 62 63 return 0; 64 65 }
POJ: 2413 ——优先队列——结构体cmp函数一级排序
标签:
原文地址:http://www.cnblogs.com/lwhone/p/4232121.html