POJ 2010 Moo University - Financial Aid(堆维护滑窗kth,二分)
生活随笔
收集整理的這篇文章主要介紹了
POJ 2010 Moo University - Financial Aid(堆维护滑窗kth,二分)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
按照score排序,貪心,從左到右用堆維護并且記錄前面的最小N/2個花費之和。
然后從右向左枚舉中位數(shù),維護N/2個數(shù)之和加上并判斷是否滿足條件。(stl的隊列沒有clear(),只能一個一個pop...
復雜度O(nlogn)?
也可以二分。先按照score排序,記錄備份牛在排序后的下標。然后將備份按照資金排序,
,二分中位數(shù)的值,對于mid值,按照備份順序貪心選擇牛,根據(jù)之前的下標判斷在左邊或者右邊。
因為是最貪心的選,如果兩邊都不夠,說明無解。如果某一邊少了,mid就應該往相反的方向移動。
如果滿足條件就記錄答案,并向上縮小區(qū)間。
復雜度也是O(nlogn)
#include<cstdio> #include<iostream> #include<string> #include<cstring> #include<queue> #include<vector> #include<stack> #include<vector> #include<map> #include<set> #include<algorithm> //#include<bits/stdc++.h> using namespace std;#define PB push_back #define MP make_pair #define fi first #define se second #define PS pushconst int maxn = 1e5+5; const int maxsz = 1e4+5; struct BinaryHEAP {int Heap[maxsz];int sz;#define Cmp(a,b) ((a)>(b))void push(int x){int i = ++sz;while(i > 1){int p = i>>1;if(!Cmp(x,Heap[p])) break;Heap[i] = Heap[p];i = p;}Heap[i] = x;}void pop(){int x = Heap[sz--];int i = 1;while((i<<1)<=sz){int a = i<<1, b = i<<1|1;if(b<=sz && Cmp(Heap[b],Heap[a])) a = b;if(!Cmp(Heap[a],x)) break;Heap[i] = Heap[a];i = a;}Heap[i] = x;}int top(){ return Heap[1]; }//int operator[](int x){ return Heap[x]; } }q;pair<int,int> cow[maxn]; int N, C, F; int Half; int preSum[maxn];int sol() {sort(cow,cow+C);int Half = N>>1, sum = 0;for(int i = 0; i < Half; i++) {sum += cow[i].se;q.push(cow[i].se);}for(int i = Half; i < C-Half; i++){preSum[i] = sum;if(q.top() > cow[i].se) {sum -= q.top();q.pop();sum += cow[i].se;q.push(cow[i].se);}}q.sz = 0;sum = 0;for(int i = C-Half; i < C; i++) {sum += cow[i].se;q.push(cow[i].se);}for(int i = C-Half; --i >= Half; ){if(sum + preSum[i] + cow[i].se <= F) return cow[i].fi;if(q.top() > cow[i].se) {sum -= q.top();q.pop();sum += cow[i].se;q.push(cow[i].se);}}return -1; }//#define LOCAL int main() { #ifdef LOCALfreopen("in.txt","r",stdin); #endifscanf("%d%d%d",&N,&C,&F);for(int i = 0; i < C; i++){scanf("%d%d",&cow[i].fi,&cow[i].se);}printf("%d\n",sol());return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/jerryRey/p/4889437.html
總結(jié)
以上是生活随笔為你收集整理的POJ 2010 Moo University - Financial Aid(堆维护滑窗kth,二分)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【WIN10】程序內文件讀取與保存
- 下一篇: 相关网站