POJ}-2051 Argus(数据结构-堆)

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;
}

 

posted on 2021-01-31 17:16  mmn  阅读(70)  评论(0编辑  收藏  举报