http://poj.org/problem?id=2051
题目大意:有若干任务,给出任务的id(各个任务唯一)和执行间隔(各个任务不唯一);要求按照执行的时间顺序来输出要求的前k个任务id号;当两个任务在同一时间执行时,先输出id小的。
直接用priority_queue进行模拟操作,每次对最优元素出队列然后对该元素进行处理在把处理后的元素重新放入队列。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <set> #include <map> #include <cmath> #include <queue> using namespace std; template <class T> void checkmin(T &t,T x) {if(x < t) t = x;} template <class T> void checkmax(T &t,T x) {if(x > t) t = x;} template <class T> void _checkmin(T &t,T x) {if(t==-1) t = x; if(x < t) t = x;} template <class T> void _checkmax(T &t,T x) {if(t==-1) t = x; if(x > t) t = x;} typedef pair <int,int> PII; typedef pair <double,double> PDD; typedef long long ll; #define foreach(it,v) for(__typeof((v).begin()) it = (v).begin(); it != (v).end ; it ++) struct node { int num , record , time; bool operator < (const node& a) const { return time > a.time || time == a.time && num > a.num;; } }; priority_queue<node> q; node a; int n; char ch[22]; int main() { while(scanf("%s",ch) && ch[0] != '#') { scanf("%d%d",&a.num,&a.record); a.time = a.record; q.push(a); } scanf("%d",&n); while(n--) { a = q.top(); q.pop(); printf("%d\n",a.num); a.time += a.record; q.push(a); } return 0; }