何老板捡钻石
Time Limit:1000MS Memory Limit:65536K
Total Submit:207 Accepted:119
Description
“欢迎来安哥拉观光,运气好能捡到钻石,运气不好就踩中地雷",看了这则旅游广告,何老板决定去安哥拉碰碰运气。到了安哥拉才发现有个坑爹的规定:游客最多只能带走n颗钻石,否则就视为走私。
何老板运气很好,他很快就搜集齐了n颗钻石,他把它们编号1到n放进了箱子。在回机场的路上,何老板发现路边还可以零星的捡到一些钻石。沿路何老板总共发现了m颗钻石,他把它们编号为n+1到n+m。何老板是个聪明人,他只会带走较重的钻石,如果捡起的钻石比箱子里的都要轻,何老板就直接把它扔掉,否则他就把箱子中最轻的钻石扔了,把新捡的放进箱子。
请问何老板沿途把哪些钻石从箱子里扔了出去,请按先后顺序打印出被扔出的钻石的编号。(假定每颗钻石的重量都不同,不超过int范围)。
Input
第一行,两个空格间隔的整数n和m,(n<=20000,m<=100000)
第二行,n个空格间隔的整数,表示已装到箱子中的n颗钻石的重量
第三行,m个空格间隔的整数,表示沿途捡到的m颗钻石的重量
Output
只有一行:若干个空格间隔的整数,表示从箱子里扔出的钻石的编号
Sample Input
5 5
8 5 9 3 7
4 2 1 15 8
Sample Output
4 6 2
Source
优先队列,也可以说是小根堆,主要注意重载小于运算符
#include<cstdio>
#include<queue>
using namespace std;
struct wk{
int num;
int id;//记录当前编号
};
bool operator<(wk a,wk b){
return a.num>b.num;
}//重载小于运算符
priority_queue<wk>q;
int n,m;
int main(){
scanf("%d%d",&n,&m);
int i,j,a;
wk x;
for(i=1;i<=n;i++){
scanf("%d",&x.num);
x.id=i;
q.push(x);
}
for(i=1;i<=m;i++){
scanf("%d",&x.num);
if(x.num>q.top().num){
printf("%d ",q.top().id);
q.pop();
x.id=i+n;
q.push(x);
}
}
}