POJ_2010 Moo University - Financial Aid 堆预处理
Posted dybala21
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ_2010 Moo University - Financial Aid 堆预处理相关的知识,希望对你有一定的参考价值。
一、题面
二、分析
堆预处理
首先可以考虑吧随便取一个点,判断两侧的最小的总费用是多少,然后相加判断是否满足条件。如果直接判断会超时,所以需要用大根堆预处理一下。先看从分数最小的往最大的预处理,先取N/2个相加,并把他们都加入到堆中,先假设这个和值是最大的,然后不断往后扫描的过程中,不断更新大根堆的根值,以及它的和。反向预处理类似。比较容易出错的是选的范围,如果不用那些不可能到的点,可以随意点,但如果需要使用这些点,需要用足够大的值填充。
三、AC代码
1 #include <cstdio> 2 #include <algorithm> 3 #include <queue> 4 #include <fstream> 5 #include <iostream> 6 7 using namespace std; 8 9 const int MAXN = 1e5+4; 10 int N, C, F, ans; 11 struct Node 12 { 13 int score, aid; 14 bool operator<(const Node t)const 15 { 16 return score < t.score; 17 } 18 }Calves[MAXN]; 19 int Left[MAXN], Right[MAXN]; 20 21 void solve() 22 { 23 priority_queue<int, vector<int>, less<int> > pql, pqr; 24 int i, temp, sum = 0; 25 //正向扫描求最小和,保持大根堆的容量始终为N/2 26 for(i = 0; i < N/2; i++) 27 { 28 sum += Calves[i].aid; 29 Left[i] = 0; 30 pql.push(Calves[i].aid); 31 } 32 for(i; i < C-N/2; i++) 33 { 34 Left[i] = sum; 35 temp = pql.top(); 36 if(Calves[i].aid < temp) 37 { 38 pql.pop(); 39 sum -= temp; 40 sum += Calves[i].aid; 41 pql.push(Calves[i].aid); 42 } 43 } 44 45 //反向扫描 46 sum = 0; 47 for(i = C-1; i > C-N/2-1; i--) 48 { 49 sum += Calves[i].aid; 50 Right[i] = 0; 51 pqr.push(Calves[i].aid); 52 } 53 for(i; i >= N/2; i--) 54 { 55 Right[i] = sum; 56 temp = pqr.top(); 57 if(Calves[i].aid < temp) 58 { 59 pqr.pop(); 60 sum -= temp; 61 sum += Calves[i].aid; 62 pqr.push(Calves[i].aid); 63 } 64 } 65 66 } 67 68 int main() 69 { 70 // freopen("input.txt", "r", stdin); 71 // freopen("out.txt", "w", stdout); 72 while(scanf("%d %d %d", &N, &C, &F)!=EOF) 73 { 74 bool flag = false; 75 for(int i = 0; i < C; i++) 76 { 77 scanf("%d %d", &Calves[i].score, &Calves[i].aid); 78 } 79 sort(Calves, Calves+C); 80 solve(); 81 for(int i = C-N/2-1; i >= N/2; i--) 82 { 83 if(Right[i] + Left[i] + Calves[i].aid <= F) 84 { 85 printf("%d ", Calves[i].score); 86 flag = true; 87 break; 88 } 89 } 90 if(!flag) 91 { 92 printf("-1 "); 93 } 94 } 95 return 0; 96 }
以上是关于POJ_2010 Moo University - Financial Aid 堆预处理的主要内容,如果未能解决你的问题,请参考以下文章
poj2010 Moo University - Financial Aid
poj 2010 Moo University - Financial Aid
POJ 2010 Moo University - Financial Aid
POJ 2010 Moo University - Financial Aid( 优先队列+二分查找)