用优先队列暴力是肯定超时的,这里我们可以注意到因为s最大只有100,所以可以用优先队列数组,数组下标即使相同的si.
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
struct node{
int fi;
int id;
bool operator<(const node &a)const{
if(fi==a.fi)
return id>a.id;
else
return fi<a.fi;
}
};
priority_queue<node>q[105];
int main(){
ios::sync_with_stdio(false);
int T;
int cas=1;
cin>>T;
while(T--){
int n;
cin>>n;
cout<<"Case #"<<cas++<<":"<<endl;
for(int i=1;i<=n;i++){
int a,b;
node p;
cin>>a>>b;
p.fi=a;
p.id=i;
q[b].push(p);
}
for(int i=0;i<n;i++){ //n既代表选手数,也代表当前时间
int pos,pid,max=-1;
for(int j=1;j<101;j++){ //遍历q数组
if(!q[j].empty()){
node p=q[j].top();
if(p.fi+j*i>max||(p.fi+j*i==max&&p.id<pid)){
pos=j;
pid=p.id;
max=p.fi+j*i;
}
}
}
if(i!=n-1)
cout<<pid<<" ";
else
cout<<pid;
q[pos].pop();
}
cout<<endl;
}
return 0;
}