Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 4235 | Accepted: 1293 |
Description
Input
Output
Sample Input
3 5 70 30 25 50 21 20 20 5 18 35 30
Sample Output
35
Hint
Source
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 6 using namespace std; 7 8 #define maxn 100005 9 10 struct node { 11 int id,aid,sco; 12 }; 13 14 int n,c,f; 15 node calve[maxn],s[maxn]; 16 int sma[maxn],big[maxn]; 17 18 bool cmp1(node a,node b) { 19 return a.aid < b.aid; 20 } 21 22 bool cmp2(node a,node b) { 23 return a.sco < b.sco; 24 } 25 26 int check(int x) { 27 int sum = s[x].aid,left = 0,right = 0; 28 29 for(int i = 1; i <= c; ++i) { 30 if(calve[i].id < x && sum + calve[i].aid <= f && left < n / 2) { 31 sum += calve[i].aid; 32 ++left; 33 } else if(calve[i].id > x && sum + calve[i].aid <= f && right < n / 2) { 34 sum += calve[i].aid; 35 ++right; 36 } 37 } 38 39 if(left < n /2 ) return 2; 40 if(right < n / 2) return 1; 41 return 0; 42 43 44 45 46 47 } 48 49 void solve() { 50 int l = 1,r = c; 51 52 //for(int i = 1; i <= c; ++i) printf("%d ",s[i].sco); 53 while(l < r) { 54 int mid = (l + r + 1) >> 1; 55 if(check(mid) == 1) { 56 r = mid - 1; 57 } else if(check(mid) == 2) { 58 l = mid + 1; 59 } else { 60 l = mid; 61 } 62 } 63 64 65 66 printf("%d\n",s[l].sco); 67 68 } 69 70 int main() 71 { 72 73 // freopen("sw.in","r",stdin); 74 75 scanf("%d%d%d",&n,&c,&f); 76 77 for(int i = 1; i <= c; ++i) { 78 scanf("%d%d",&s[i].sco,&s[i].aid); 79 } 80 81 sort(s + 1,s + c + 1,cmp2); 82 83 for(int i = 1; i <= c; ++i) { 84 calve[i].id = s[i].id = i; 85 calve[i].sco = s[i].sco; 86 calve[i].aid = s[i].aid; 87 } 88 89 90 91 sort(calve + 1,calve + 1 + c,cmp1); 92 93 int sum = 0; 94 for(int i = 1; i <= n; ++i) { 95 sum += calve[i].aid; 96 } 97 98 if(sum > f) { 99 printf("-1\n"); 100 } else { 101 solve(); 102 } 103 104 return 0; 105 }
第二种方法是用大根堆,首先按照score从小到大排序。用大根堆预处理数组dpl[i]代表从1 到 i 能得到的数量为 n / 2的最小的aid ,dpr[i]代表 从i 到 c能得到的数量为 n / 2的最小的aid,具体方法是,若堆的大小小于 n / 2,则不断入列,否则进列,并删除堆顶。
则从大到小找出能满足条件的最大的中位数。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 7 using namespace std; 8 9 #define maxn 100005 10 11 struct node { 12 int sco,aid; 13 }; 14 15 int n,c,f; 16 node s[maxn]; 17 int dpl[maxn],dpr[maxn]; 18 19 bool cmp(node a,node b) { 20 return a.sco < b.sco; 21 } 22 23 bool cmp2(node a,node b) { 24 return a.aid < b.aid; 25 } 26 27 void solve() { 28 priority_queue<int> q; 29 int sum = 0; 30 for(int i = 1; i <= c; ++i) { 31 if(q.size() < (n / 2)) { 32 sum += s[i].aid; 33 q.push(s[i].aid); 34 } else { 35 q.push(s[i].aid); 36 sum += s[i].aid; 37 sum -= q.top(); 38 q.pop(); 39 40 } 41 dpl[i] = sum; 42 } 43 44 while(!q.empty()) q.pop(); 45 sum = 0; 46 for(int i = c; i >= 1; --i) { 47 if(q.size() < (n / 2)) { 48 sum += s[i].aid; 49 q.push(s[i].aid); 50 } else { 51 q.push(s[i].aid); 52 sum += s[i].aid; 53 sum -= q.top(); 54 q.pop(); 55 56 } 57 dpr[i] = sum; 58 } 59 60 61 int ans; 62 for(int i = c; i >= 1; --i) { 63 if(i - 1 < n / 2 || c - i < n / 2) continue; 64 if(dpl[i - 1] + dpr[i + 1] + s[i].aid <= f) { 65 ans = s[i].sco; 66 break; 67 } 68 } 69 70 printf("%d\n",ans); 71 72 } 73 74 75 int main() { 76 //freopen("sw.in","r",stdin); 77 78 scanf("%d%d%d",&n,&c,&f); 79 80 for(int i = 1; i <= c; ++i) { 81 scanf("%d%d",&s[i].sco,&s[i].aid); 82 } 83 84 sort(s + 1,s + c + 1,cmp2); 85 int sum = 0; 86 for(int i = 1; i <= n; ++i) sum += s[i].aid; 87 if(sum > f) { 88 printf("-1\n"); 89 return 0; 90 } 91 92 sort(s + 1,s + c + 1,cmp); 93 94 solve(); 95 96 return 0; 97 98 99 }
原文:http://www.cnblogs.com/hyxsolitude/p/3617276.html