题意:
有c有牛,从中选(n-1)/2头,使他们的得分中位数最大且需要的资金援助和不超过f.
分析:
堆的运用大顶堆维护最小和。
代码:
//poj 2010 //sep9 #include <iostream> #include <queue> #include <algorithm> using namespace std; const int maxN=100024; int dpl[maxN],dpr[maxN]; priority_queue<int> Q; struct Cow { int s,f; }cow[maxN]; int cmp(Cow x,Cow y) { return x.s>y.s; } int main() { int i,n,c,f; while(scanf("%d%d%d",&n,&c,&f)==3){ n=(n-1)/2; for(i=1;i<=c;++i) scanf("%d%d",&cow[i].s,&cow[i].f); sort(cow+1,cow+1+c,cmp); while(!Q.empty()) Q.pop(); int sum=0; for(i=1;i<=n;++i) Q.push(cow[i].f),sum+=cow[i].f; dpl[n]=sum; for(i=n+1;i<=c;++i) if(cow[i].f>=Q.top()) dpl[i]=sum; else{ sum=sum-Q.top()+cow[i].f; Q.pop(); Q.push(cow[i].f); dpl[i]=sum; } sum=0; while(!Q.empty()) Q.pop(); for(i=c;i>=c-n+1;--i) Q.push(cow[i].f),sum+=cow[i].f; dpr[c-n+1]=sum; for(i=c-n;i>=1;--i) if(cow[i].f>=Q.top()) dpr[i]=sum; else{ sum=sum-Q.top()+cow[i].f; Q.pop(); Q.push(cow[i].f); dpr[i]=sum; } bool ok=false; for(i=n+1;i<=c-n;++i) if(cow[i].f+dpl[i-1]+dpr[i+1]<=f){ ok=true; printf("%d\n",cow[i].s); break; } if(!ok) printf("-1\n"); } return 0; }
时间: 2024-10-19 07:26:40