博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2010 Moo University - Financial Aid 优先队列
阅读量:6207 次
发布时间:2019-06-21

本文共 1427 字,大约阅读时间需要 4 分钟。

题意:给你c头牛,并给出每头牛的分数和花费,要求你找出其中n(n为奇数)头牛,并使这n头牛的分数的中位数尽可能大,同时这n头牛的总花费不能超过f,否则输出-1.

 

思路:首先对n头牛按分数进行排序,然后假设当前这头牛X的分数为中位数,然后求出X前面n/2头牛的最小花费和,以及后面n/2头牛的最小花费和。

   因为按分数排序,X的前n/2和后n/2的牛的分数肯定分别大于等于X和小于等于X,所以X的分数肯定会是中位数。

   所以,我们令left[i]为牛i的前n/2头牛的最小花费和,right[i]为牛i的后n/2头牛的最小花费和,然后i从c-1到0遍历,求出第一个头牛的left[i]+right[i]+X的花费 ≤ f,该头牛的分数就是所求出的最大中位数。

 

AC代码:

#include 
#include
#include
using namespace std;const int MAX_N = 100005;int n,c,f, left[MAX_N], right[MAX_N], half,total,result;pair
w[MAX_N];void solve(){ half = n/2; total = 0; priority_queue
q; for(int i = 0; i < c; i++) { left[i] = q.size() == half ? total : 0x3f3f3f3f; q.push(w[i].second); total += w[i].second; if(q.size() > half) { total -= q.top(); q.pop(); } } total = 0; while(!q.empty()) q.pop(); for(int i = c-1; i >= 0; i--) { right[i] = q.size() == half ? total : 0x3f3f3f3f; q.push(w[i].second); total += w[i].second; if(q.size() > half) { total -= q.top(); q.pop(); } } result = -1; for(int i = c-1; i >= 0; i--) { int x = left[i] + w[i].second + right[i]; if(x <= f) { result = w[i].first; break; } } printf("%d\n", result);}int main(){ scanf("%d %d %d", &n, &c, &f); for(int i = 0; i < c; i++) scanf("%d %d", &w[i].first, &w[i].second); sort(w,w+c); solve(); return 0;}

  

转载于:https://www.cnblogs.com/sevenun/p/5477993.html

你可能感兴趣的文章
mongodb分布式集群搭建手记
查看>>
您有一个上云锦囊尚未领取!
查看>>
Java Web的web.xml文件作用及基本配置(转)
查看>>
区块链101:区块链的应用和用例是什么?
查看>>
马约拉纳费米子:推动量子计算的“天使粒子”
查看>>
瑞立视:厚积薄发且具有“工匠精神”的中国品牌
查看>>
git与svn的区别 ?Git 与 SVN那个更好?
查看>>
使用ActionTrail Python SDK
查看>>
数据显示,中国近一半的独角兽企业由“BATJ”四巨头投资
查看>>
log日志轮转--logrotate
查看>>
安装输入发
查看>>
用户配置相关文件
查看>>
老王学linux-ftp
查看>>
kvm vnc的使用,鼠标漂移等
查看>>
linux中fcntl()、lockf、flock的区别
查看>>
gitlab 2.7版本升级到2.8
查看>>
linux用户空间和内核exit的语义--linux没有线程
查看>>
获取Extjs文本域中的内容
查看>>
RHEL 5基础篇—常见系统启动类故障
查看>>
对‘初学者应该选择哪种编程语言’的回答——计算机达人成长之路(38)
查看>>