poj 2051 UVA 1203 LA 3135 Argus 题解

题意简述

有一些进程,每个进程有两个属性:id和per。id表示进程编号,per表示每per的时刻就会被调用一遍。如果有多个进程在同一时刻被调用,先调用进程编号小的。求先调用的k个进程。

思路框架

优先队列。定义小于号,每次取最小的,然后把它下一次被调用的时间放回优先队列。

具体思路

优先队列中,如果ab的时间,然后判断a的id>b的id。

对于一个进程(id,Time,per),它的下一次调用显然珂以被表示为(id,Time+per,per)。我们每次从优先队列中取最优先的(id,Time,per),将它弹出队列,然后把(id,Time+per,per)入队列,即珂

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <cstdio>
#include <cstring>
#include <cstdarg>
#include <algorithm>
#include <queue>
using namespace std;
namespace Flandre_Scarlet
{
#define N 155555
#define F(i,l,r) for(int i=l;i<=r;++i)
#define D(i,r,l) for(int i=r;i>=l;--i)
#define Fs(i,l,r,c) for(int i=l;i<=r;c)
#define Ds(i,r,l,c) for(int i=r;i>=l;c)
#define MEM(x,a) memset(x,a,sizeof(x))
#define FK(x) MEM(x,0)
#define Tra(i,u) for(int i=G.Start(u),__v=G.To(i);~i;i=G.Next(i),__v=G.To(i))
#define p_b push_back
#define sz(a) ((int)a.size())
#define iter(a,p) (a.begin()+p)
void R1(int &x)
{
x=0;char c=getchar();int f=1;
while(c<'0' or c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0' and c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
x=(f==1)?x:-x;
}
void Rd(int cnt,...)
{
va_list args;
va_start(args,cnt);
F(i,1,cnt)
{
int* x=va_arg(args,int*);R1(*x);
}
va_end(args);
} //感谢@http://dev.Sukazyo.cc赠送的读多个整数的Rd函数
struct node{int id,per,Time;}; bool operator<(node a,node b){return a.Time>b.Time or (a.Time==b.Time and a.id>b.id);}
//operator<: 先比较a.Time>b.Time,再比较a.id>b.id。

char s[N];int k;
priority_queue<node> Q;
void Input()
{
while(~scanf("%s",s))
{
if (s[0]=='#') break;
else
{
int id,tm;Rd(2,&id,&tm);
Q.push((node){id,tm,tm}); //读的时候就入队列
}
}
R1(k);
}

void Soviet()
{
F(i,1,k)
{
node Min=Q.top();Q.pop();
printf("%d\n",Min.id);
Q.push((node){Min.id,Min.per,Min.Time+Min.per});
}
}

#define Flan void
Flan IsMyWife()
{
Input();
Soviet();
}
}
int main(){
Flandre_Scarlet::IsMyWife();
getchar();getchar();
return 0;
}
w