poj 2010 Moo University - Financial Aid 优先队列
2015-11-09 22:25
501 查看
题目
题目链接:http://poj.org/problem?id=2010题目来源:《挑战》练习题
简要题意:有CC头牛成绩aia_i,代价bib_i,钱FF。
\qquad \quad \ \ \ \ 求一秩为NN的牛的子集,代价和不超过FF且牛成绩的中位数最大。
数据范围:1⩽N⩽19999;N⩽C⩽1051 \leqslant N \leqslant 19999;\quad N \leqslant C \leqslant 10^5\quad 代价不爆INT
题解
首先需要排序,然后扫两遍处理出从前后面到某位置取NN头的最小代价。这实际上就是维护一个堆,对于和可以另外保存一个值来搞。
最后再扫一遍判断一下就行了。
实现
堆的功能可以直接用优先队列来代替。做的时候把一个i写成了l,然后很自信地WA了若干发,今天做题不顺啊。
觉得还是要吸取教训啊,要好好测试,好好思考才行,尤其是贪心,想法题。
要注意N=1N=1的情况,这个时候队列可能为空,要判断。
另一种做法是去二分答案,前后再排序搞。
代码
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> #include <stack> #include <queue> #include <string> #include <vector> #include <set> #include <map> #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define sz(x) ((int)(x).size()) #define fi first #define se second using namespace std; typedef long long LL; typedef vector<int> VI; typedef pair<int,int> PII; LL powmod(LL a,LL b, LL MOD) {LL res=1;a%=MOD;for(;b;b>>=1){if(b&1)res=res*a%MOD;a=a*a%MOD;}return res;} // head const int N = 1E5+5; PII a ; int sumf ; int sumb ; int main() { int n, m, lim; scanf("%d%d%d", &n, &m, &lim); n >>= 1; int l = n+1, r = m-n; for (int i = 1; i <= m; i++) { scanf("%d%d", &a[i].fi, &a[i].se); } sort(a+1, a+m+1); if (n > 0) { priority_queue<int> q; for (int i = 1; i < l; i++) { q.push(a[i].se); sumf[i] = sumf[i-1]+a[i].se; } for (int i = l; i <= r; i++) { sumf[i] = sumf[i-1]; if (a[i].se >= q.top()) continue; sumf[i] -= q.top() - a[i].se; q.pop(); q.push(a[i].se); } while (!q.empty()) q.pop(); for (int i = m; i > r; i--) { q.push(a[i].se); sumb[i] = sumb[i+1]+a[i].se; } for (int i = r; i >= l; i--) { sumb[i] = sumb[i+1]; if (a[i].se >= q.top()) continue; sumb[i] -= q.top() - a[i].se; q.pop(); q.push(a[i].se); } } int ans = -1; for (int i = l; i <= r; i++) { if (sumf[i-1]+sumb[i+1]+a[i].se <= lim) { ans = a[i].fi; } } printf("%d\n", ans); return 0; }
相关文章推荐
- fibonacci && climbing-stairs
- LightOJ 1021 - Painful Bases(dp)
- http://blog.csdn.net/jadyer/article/details/6013743
- hdu 3264 Open-air shopping malls(几何)
- hdu4770 Lights Against Dudely
- Gradle project sync failed. Please fix your project and try again.
- 正确使用Block避免Cycle Retain和Crash
- Scala初学者学习资料:main(String[])
- 运行Scala应用 Main方法
- .NET 4.0 使用 asyn await
- 父进程等待子进程结束 waitpid wait
- Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON
- git常见错误failed to push some refs to
- NovaException: Unexpected vif_type=binding_failed
- LightOJ 1138 Trailing Zeroes (III)(二分 + 思维)
- 重新启动SNMP服务解决监控AIX系统问题
- Referenced file contains errors 解决方法 (转载地址:http://blog.sina.com.cn/s/blog_6a6b141001011xhn.html)
- Package should contain a content type part [M1.13]
- IntelliJ IDEA 官方网站 http://www.jetbrains.com/idea/
- wait sleep区别