题意:一些指令按照时间执行,每次执行一条指令以后经过一个周期这个指令会再执行一次。求前k个执行的指令
思路:优先队列
LRJ的书上的答案用标准库写的,自己拿二叉堆写了一遍
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
struct argus
{
int id;
int Time;
int period;
bool operator < (const argus a) const{
return Time<a.Time||(Time==a.Time&&id<a.id);
}
};
struct BinaryHeap
{
vector<argus> heap;
void init()
{
argus tmp;
tmp.id=-1;
heap.push_back(tmp);
}
void push(argus v)
{
heap.push_back(v);
up(heap.size()-1);
}
argus pop()
{
argus ret=heap[1];
heap[1]=heap[heap.size()-1];
heap.pop_back();
down(1);
return ret;
}
void up(int n)
{
argus x=heap[n];
for(int j=n/2;j>=1;j/=2)
{
if(x<heap[j])
{
heap[n]=heap[j];
n=j;
}
else break;
}
heap[n]=x;
}
void down(int n)
{
argus x=heap[n];
for(int j=n*2;j<=heap.size()-1;j*=2)
{
j += j<heap.size()-1 && heap[j+1]<heap[j] ;
if(heap[j]<x)
{
heap[n]=heap[j];
n=j;
}
else break;
}
heap[n]=x;
}
};
BinaryHeap q;
int main()
{
// freopen("data.txt","r",stdin);
char s[20];
q.init();
while(scanf("%s",s))
{
if(s[0]=='#')break;
argus tmp;
scanf("%d%d",&tmp.id,&tmp.period);
tmp.Time=tmp.period;
q.push(tmp);
}
int k;
scanf("%d",&k);
while(k--)
{
argus tmp=q.pop();
printf("%d\n",tmp.id);
tmp.Time+=tmp.period;
q.push(tmp);
}
return 0;
}