UVA 1203 Argus(优先队列)

UVA 1203 Argus(优先队列)

题意:

        给你多个命令,每个命令如Register 2004 200 对应于编号为2004的事件,每隔200秒发生一次(首次发生是在200秒).然后在给你一个K,要你输出前K个发生事件的编号.如果几个事件同时发生,输出事件编号小的.

分析:

        刘汝佳训练指南P188例题.

        本题只需要维护一个优先队列即可,每次从队列中取出时间最小且编号最小的事件,输出其编号,然后将其发生时间加上一个周期再从新放入优先队列即可.

AC代码(新):

#include<queue>
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;

struct Node
{
    int id;
    int time;
    int period;

    Node(int id,int time,int period):id(id),time(time),period(period){}

    bool operator<(const Node &rhs)const
    {
        return time>rhs.time || ( time==rhs.time && id>rhs.id );
    }
};

int main()
{
    string com;//Register
    priority_queue<Node> Q;

    while(cin>>com)
    {
        if(com=="#") break;

        int id,time;
        cin>>id>>time;

        Q.push(Node(id,time,time));
    }

    int k;
    scanf("%d",&k);

    while(k--)
    {
        Node tmp = Q.top(); Q.pop();
        cout<<tmp.id<<endl;

        tmp.time += tmp.period;
        Q.push(tmp);
    }

    return 0;
}

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{
    int num;
    int time;
    int period;
    bool operator<(const node&b)const
    {
        return time>b.time ||(time==b.time&&num>b.num);
    }
};
int main()
{
    priority_queue<node> pq;
    char s[1000];
    int k;
    while(scanf("%s",s)==1&&s[0]!='#')
    {
        node r;
        scanf("%d%d",&r.num,&r.period);
        r.time=r.period;
        pq.push(r);
    }
    scanf("%d",&k);
    while(k--)
    {
        node r=pq.top();pq.pop();
        printf("%d\n",r.num);
        r.time+=r.period;
        pq.push(r);
    }
    return 0;
}


你可能感兴趣的:(ACM)