poj 2010 优先队列~
2016-06-05 18:39
369 查看
点击打开链接
#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;
}
#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;
}
相关文章推荐
- 计算器第六次作业——界面
- Jenkins 权威指南(中文版) 第一章 Jenkins的介绍
- 2016创业项目关注
- android之在子线程刷新UI
- Eclipse + Python 的安装与配置流程
- Mysql读写分离,同步复制的探索实现
- 部分find命令使用
- 防止头文件多次引入
- 二分法查找元素位置
- 结构体内存对齐
- C++ 复杂链表的复制
- 二叉树基础
- 大牛Git教程
- 鸡汤君_一个老程序员的建议66
- pthread_once,pthread_key_create,pthread_setspecific,pthread_getspecific
- 【leetcode】3. Longest Substring Without Repeating Characters
- C++_智能指针
- JAVA WEB 之 XML(1)
- NET:交换机的背板带宽,交换容量,包转发率区别
- C++Primer_笔记_异常处理