题目链接:http://poj.org/problem?id=2051
思路:就是把此次出队列的数据的出现的时间值加上它的周期,得到下次出现的时间,然后按这个时间的数据值加入到优先队列中。
//2014-7-6
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
struct Node
{
int num,per,sum;
bool operator<(const Node& a) const
{
return sum>a.sum||(sum==a.sum&&num>a.num);
}
};
int main()
{
int k;
char str[100];
priority_queue<Node> Q;
while(~scanf("%s",str))
{
while(str[0]!='#')
{
Node P;
scanf("%d%d",&P.num,&P.per);
P.sum=P.per; //计算ID号为num的数出第一次出现的时间
Q.push(P);
scanf("%s",str);
}
Node P;
scanf("%d",&k);
while(k--)
{
Node P=Q.top(); //找出最近出现的数
Q.pop();
P.sum+=P.per; //计算出队首(即此次出现的)ID号为num下次出现的时间并把它放入到队列中
printf("%d\n",P.num);
Q.push(P);
}
}
return 0;
}