http://poj.org/problem?id=2051
题意:
有若干任务,给出任务的id和执行间隔;要求按照执行的时间顺序来输出要求的前k个任务id号;当两个任务在同一个时间执行时,先输出id小的。
思路:
维持一个最小堆,每次输出根节点,然后再相应地改变根节点的时间,向下调整最小堆,如此执行K次。
代码:
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string> #include<iomanip> #include<algorithm> #include<string.h> #include<queue> #include<cmath> #include<stack> using namespace std; const int maxn=1e5+10; const int inf=1e10; typedef long long ll; struct Node { int now; int q; int p; }; Node node[3001]; int K; void down(Node H[],int s,int m) { Node rc=H[s]; for(int j=s*2; j<=m; j*=2){ if(j<m){ if(H[j].now>H[j+1].now){ j++; }else{ if((H[j].now==H[j+1].now)&&H[j].q>H[j+1].q) j++; } } if(rc.now<H[j].now||(rc.now==H[j].now&&rc.q<H[j].q)) break; H[s]=H[j]; s=j; } H[s]=rc; } void MakeMinHeap(Node H[],int length) { for(int i=length/2; i>0; --i){ down(H,i,length); } } int main() { string str; int i=1; cin>>str; while(str.compare("#")!=0){ cin>>node[i].q>>node[i].p; node[i].now=node[i].p; i++; cin>>str; } int len=i-1; cin>>K; MakeMinHeap(node,len); for(i=1; i<=K; i++){ cout<<node[1].q<<endl; node[1].now+=node[1].p; down(node,1,len); } system("pause"); return 0; }
原文:https://www.cnblogs.com/sweetlittlebaby/p/14353129.html