zoukankan      html  css  js  c++  java
  • Evanyou Blog 彩带

      题目传送门

      分析:题目中提到了优先级,很显然这题要用优先队列+模拟。题目中很多细节需要注意,还是在代码中解释吧,这里我用的是手打的堆。

      Code:

      

    #include<bits/stdc++.h>
    using namespace std;
    const int N=3e5+7;
    int heap[N],size,now;
    struct Pro{
      int time,rank;
    }pro[N];
    inline bool check(int x,int y)//比较,维护大根堆
    {
      if(pro[x].rank!=pro[y].rank)return pro[x].rank>pro[y].rank;
    //优先比较优先级
    return x<y;
    //否则比较序号,实际上也就是比较到达时间 } inline
    void insert(int x) { heap[++size]=x; int ka=size; while(ka>1){ int x=heap[ka],y=heap[ka/2]; if(check(x,y)){ swap(heap[ka],heap[ka/2]);ka/=2;} else break; } } inline void delet() { heap[1]=heap[size--]; int ka=1,s=ka*2; while(s<=size){ if(s<size){ int x=heap[s+1],y=heap[s]; if(check(x,y)) s++;} int x=heap[s],y=heap[ka]; if(check(x,y)){ swap(heap[s],heap[ka]);ka=s;s=ka*2;} else break; } } int main() { int a,b,c,d; while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF){ pro[a].time=c;pro[a].rank=d;//插入新元素 while(size>0){ int x=heap[1];delet(); if(now+pro[x].time<=b){//如果队首命令可以在新命令到达之前完成,直接输出 now+=pro[x].time; printf("%d %d ",x,now);} else {//否则将执行时间减短重新放回队列 pro[x].time-=(b-now); insert(x);break; } } insert(a);now=b;//插入新命令 } while(size>0){ int x=heap[1]; delet(); now+=pro[x].time; printf("%d %d ",x,now);//输出剩余没有执行的命令 } return 0; }
  • 相关阅读:
    62-函数的调用
    40-字符串类型内置方法
    47-Python进阶小结
    44-集合的内置方法
    45-数据类型分类
    43-字典类型内置方法
    42-元组类型内置方法
    41-列表类型内置方法
    es6 Reflect对象详解
    微信小程序之公共组件写法
  • 原文地址:https://www.cnblogs.com/cytus/p/8610792.html
Copyright © 2011-2022 走看看