UVA-1203-Argus(优先队列)

题意:你的任务是编写一个称为argus的系统。该系统支持一个register命令 Register Q_num Period

该命令注册了一个触发器,它每个Period秒钟就会产生一次编号为Q_num的事件。你的任务是模拟出前K个事件。如果多个事件同时发生,先处理Q_num小的事件。

分析:

用优先队列来维护每个触发器的“下一个事件“,然后每次从中取出最早发生的一个事件,重复K次即可。

// File Name: 1203.cpp
// Author: zlbing
// Created Time: 2013/3/6 18:18:19

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<cstring>
#include<stack>
#include<cmath>
#include<queue>
using namespace std;
#define CL(x,v); memset(x,v,sizeof(x));
#define INF 0x3f3f3f3f
#define LL long long
#define REP(i,n) for(int i=0;i<n;i++)
#define REP1(i,n) for(int i=1;i<n+1;i++)
struct Item{
    int Q_num,Period,Time;
    bool operator <(const Item& T)const{
        if(Time==T.Time)
            return Q_num>T.Q_num;
        else 
            return Time>T.Time;
    }
};
int main(){
priority_queue<Item> Q;
    char str[10];
    while(~scanf("%s",str))
    {
        if(str[0]=='#')break;
        int a,b;
        scanf("%d%d",&a,&b);
        Q.push((Item){a,b,b});
    }
    int N;
    scanf("%d",&N);
    while(N--)
    {
        Item t=Q.top();
        Q.pop();
        printf("%d\n",t.Q_num);
        t.Time+=t.Period;
        Q.push(t);
    }
    return 0;
}

 

posted @ 2013-03-08 20:13  z.arbitrary  阅读(227)  评论(0编辑  收藏  举报