zoukankan      html  css  js  c++  java
  • SP348 EXPEDI

     1 //贪心+优先队列(二叉堆)
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<queue>
     5 #include<algorithm>
     6 using namespace std;
     7 const int N=1000050;
     8 #define val first
     9 #define dis second
    10 int T,n,l,s,ans,now;
    11 typedef pair<int,int> p;
    12 inline bool cmp(const p &a,const p &b){
    13     return a.dis<b.dis;
    14 }
    15 p a[N];
    16 priority_queue<int> q;//大根堆 
    17 int main(){
    18     scanf("%d",&T);
    19     while(T--){
    20         ans=now=0;//每次清空答案 
    21         scanf("%d",&n);
    22         for(int i=1;i<=n;++i) scanf("%d%d",&a[i].dis,&a[i].val);
    23         scanf("%d%d",&l,&s);
    24         for(int i=1;i<=n;++i) a[i].dis=l-a[i].dis;//处理所有距离方便计算 
    25         sort(a+1,a+1+n,cmp);//把每个点按离起点的距离排序 
    26         while(!q.empty()) q.pop();//清空二叉堆 
    27         a[++n].dis=l;//把终点当做最后一个点 避免最后再判断 
    28         for(int i=1;i<=n;++i){
    29             int d=a[i].dis-now;//当前位置到下一个点的距离 
    30             while(s<d){//若油不够 
    31                 if(q.empty()) {ans=-1;goto Nex;}//以前加不到足够的油则无解 
    32                 s+=q.top();q.pop();++ans;//从以前经过的点加最多的油 
    33             }
    34             s-=d;now=a[i].dis;//更新现在油量和所在位置 
    35             q.push(a[i].val);//把到达点的油量塞进堆里备用 
    36         }
    37         Nex:
    38         printf("%d
    ",ans);
    39     }
    40     return 0;
    41 }
  • 相关阅读:
    进程和程序
    linux socket基本知识
    window核心编程 第五章 作业
    树的基本操作(C语言)
    每天都在反省自己,但是每天却都浑浑噩噩
    Windows核心编程 内核对象
    还没完整看过一本技术的书籍啊
    管道
    Memory Layout of a C Program(7.6)
    cpio命令用法
  • 原文地址:https://www.cnblogs.com/yu-xing/p/10336360.html
Copyright © 2011-2022 走看看