小顶堆
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=0x7fffffff;
struct node{
int idx;
int pri;
int ptime;
}p[10000];
int n;
void siftdown(int k){
int t;
while(k*2<=n){
t=2*k;
if(t<n&&p[t].ptime>p[t+1].ptime)
t++;
else if(t<n&&p[t].ptime==p[t+1].ptime&&p[t].idx>p[t+1].idx)
t++;
if(p[k].ptime>p[t].ptime||(p[k].ptime==p[t].ptime&&p[k].idx>p[t].idx)){
swap(p[k],p[t]);
k=t;
}else break;
}
}
void setheap(){
for(int i=n/2;i>0;i--){
siftdown(i);
}
}
int main()
{
int num=1;
char str[20];
while(scanf("%s",str)&&str[0]!='#'){
scanf("%d%d",&p[num].idx,&p[num].pri);
p[num].ptime=p[num].pri;
num++;
}
n=--num;
setheap();
int k;
scanf("%d",&k);
while(k--){
printf("%d\n",p[1].idx);
p[1].ptime+=p[1].pri;
siftdown(1);
}
return 0;
}
STL之heap
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=0x7fffffff;
struct node{
int idx;
int pri;
int ptime;
friend bool operator<(const node& a,const node& b){
if(a.ptime==b.ptime) return a.idx>b.idx;
else return a.ptime>b.ptime;
}
}p[10000];
int main()
{
int num=0;
char str[20];
while(scanf("%s",str)&&str[0]!='#'){
num++;
scanf("%d%d",&p[num].idx,&p[num].pri);
p[num].ptime=p[num].pri;
push_heap(p+1,p+num+1);
}
int k;
scanf("%d",&k);
while(k--){
printf("%d\n",p[1].idx);
p[1].ptime+=p[1].pri;
pop_heap(p+1,p+num+1);
push_heap(p+1,p+num+1);
}
return 0;
}