poj 2010 优先队列~

来源:互联网 发布:淘宝如何自动发卡密 编辑:程序博客网 时间:2024/06/05 08:03

点击打开链接

#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;}


0 0
原创粉丝点击