poj2010 Moo University - Financial Aid 优先队列
2017-03-15 10:38
429 查看
题意:给C只小牛办学校,但是学校只能收N(N为奇数)个小牛,每个小牛有一个考试分数和他所需的费用,小牛的费用由学校来提供,但是学校只有总共F资金,现在想要使得收的N只小牛中的分数排在中间的最大化,并输出这种情况的这个中间值,如果无法满足收N个小牛就输出-1。
先把小牛用分数排序,后循环选择小牛,用优先队列算出每个小牛左边n/2个最小费用的和,在从右面用优先队列算出相应小牛的右边n/2个最小费用的和,再从右循环找出一个小牛满足左边费用和+右边费用和+当前小牛费用<=F,如果找不出就输出-1(注意要特判一下N=1的情况)
先把小牛用分数排序,后循环选择小牛,用优先队列算出每个小牛左边n/2个最小费用的和,在从右面用优先队列算出相应小牛的右边n/2个最小费用的和,再从右循环找出一个小牛满足左边费用和+右边费用和+当前小牛费用<=F,如果找不出就输出-1(注意要特判一下N=1的情况)
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<cmath> #include<set> #include<bitset> #include<map> #include<stack> #include<queue> #include<vector> #include<utility> #define INF 0x3f3f3f3f #define inf 2*0x3f3f3f3f #define llinf 1000000000000000000 #define pi acos(-1) #define mod 1000000007 using namespace std; typedef long long ll; typedef pair<int,int>P; int n,c,f,lb,ub,costl[100005],costr[100005]; struct node{ int grade,cost; }cow[100005]; bool cmp(node a,node b) { return a.grade<b.grade; } priority_queue<int>quel,quer; int main() { cin>>n>>c>>f; for(int i=0;i<c;i++)scanf("%d%d",&cow[i].grade,&cow[i].cost); sort(cow,cow+c,cmp); if(n==1) { for(int i=c-1;i>=0;i--) { if(cow[i].cost<=f) { cout<<cow[i].grade<<endl; return 0; } } cout<<-1<<endl; return 0; } for(int i=0;i<n/2;i++) { quel.push(cow[i].cost); costl[n/2]+=cow[i].cost; } for(int i=n/2+1;i<c-n/2;i++) { int p=quel.top(); if(p>cow[i-1].cost) { costl[i]=costl[i-1]-p+cow[i-1].cost; quel.pop();quel.push(cow[i-1].cost); } else { costl[i]=costl[i-1]; } } for(int i=c-1;i>=c-n/2;i--) { quer.push(cow[i].cost); costr[c-1-n/2]+=cow[i].cost; } for(int i=c-n/2-2;i>=n/2;i--) { int p=quer.top(); if(p>cow[i+1].cost) { costr[i]=costr[i+1]-p+cow[i+1].cost; quer.pop();quer.push(cow[i+1].cost); } else { costr[i]=costr[i+1]; } } for(int i=c-n/2-1;i>=n/2;i--) { if(costl[i]+costr[i]+cow[i].cost<=f) { cout<<cow[i].grade<<endl; return 0; } } cout<<-1<<endl; return 0; }
相关文章推荐
- 【优先队列】POJ2010- Moo University-Financial Aid
- POJ 2010 Moo University - Financial Aid (优先队列/二分答案)
- [POJ 2010]Moo University - Financial Aid[优先队列]
- POJ 2010 Moo University - Financial Aid 优先队列
- poj 2010 Moo University - Financial Aid 优先队列
- [优先队列] POJ2010 Moo University - Financial Aid
- Moo University - Financial Aid (poj 2010 优先队列 或者 二分)
- POJ2010-Moo University - Financial Aid-优先队列
- 【POJ 2010 Moo University-Financial Aid】优先级队列
- POJ 2010 Moo University - Financial Aid
- 优先队列 POJ 2010
- 优先队列· POJ - 2010 · Moo University - Financial Aid
- poj 2010 Moo University - Financial Aid
- POJ 2010 Moo University - Financial Aid
- POJ 2010 Moo University - Financial Aid (优先队列)
- POJ 2010 Moo University - Financial Aid (优先队列)
- Divide and conquer:Moo University - Financial Aid(POJ 2010)
- 优先队列· POJ - 2010 · Moo University - Financial Aid
- POJ 2010 Moo University - Financial Aid 优先队列
- POJ 2010 Moo University - Financial Aid