您的位置:首页 > 其它

poj 2010 优先队列~

2016-06-05 18:39 316 查看
点击打开链接

#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int M=110000;
__int64 Max=1<<30;
typedef struct NODE{
__int64 score;
__int64 money;

}Node;
Node cow[M];
__int64 n,c,f;
long Lower[M],Upper[M]; //Lower[i] 在 0~i-1中 n/2个cow的最小花费 (n是奇数)
bool cmp(Node a,Node b)
{
return a.score<b.score;
}
void pre()
{
long i,half=n/2,total=0;
priority_queue<long> q; //
for(i=0;i<c;i++)
{
Lower[i]= q.size()==half? total:Max; // 队列元素不足half 说明 0~i-1个数小于half,第i个数不可能是中位数
q.push(cow[i].money);
total+=cow[i].money;
if(q.size()>half)
{
total-=q.top(); //最大的出列-> (队列中的half个元素之和始终是 0~i-1个中的最小花费(total))!!
q.pop();
}
}
priority_queue<long> q1;
total=0;
for(i=c-1;i>=0;i--)
{
Upper[i]= q1.size()==half? total:Max;
q1.push(cow[i].money);
total+=cow[i].money;
if(q1.size()>half)
{
total-=q1.top();
q1.pop();
}
}
}
int main()
{
long i,k=0,flag=0;
cin>>n>>c>>f;
for(i=0;i<c;i++)
{
cin>>cow[i].score>>cow[i].money;
}
sort(cow,cow+c,cmp); //sort分数从小到大
pre();
for(i=c-1;i>=0;i--) //枚举最大中位数
{
if(Lower[i]+cow[i].money+Upper[i]<=f)
{
flag=1;
cout<<cow[i].score<<endl;
break;
}
}
if(!flag) cout<<-1<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: