[关闭]
@darkproject 2017-03-30T15:16:04.000000Z 字数 1761 阅读 763

stl专题

集训队


A - Moo University - Financial Aid POJ - 2010

有一个奶牛大学,给N个学生提供助学金,最多能提供F。现在有C个学生选择,给出了这些学生的成绩以及相应的助学金,然而学校希望这个N个学生的成绩的中位数尽可能地大,求这个中位数的最大值。
优先队列

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<queue>
  4. #include <functional>
  5. #include<map>
  6. #include<limits>
  7. #include<algorithm>
  8. #define INF 0x3f3f3f3f
  9. const int maxn = 100000+10;
  10. using namespace std;
  11. pair<int, int>cows[maxn];
  12. priority_queue<int>q;
  13. int n, c, ans = -1;
  14. long long f;
  15. int lcow[maxn], rcow[maxn];
  16. int main()
  17. {
  18. scanf("%d%d%lld", &n, &c, &f);
  19. for (int i = 0; i < c; i++)
  20. scanf("%d%d", &cows[i].first, &cows[i].second);
  21. int res = 0;
  22. sort(cows, cows + c);
  23. for (int i = 0; i < c; i++)
  24. {
  25. if (q.size() == (n - 1) / 2)
  26. lcow[i] = res;
  27. else
  28. lcow[i] = INF;
  29. res += cows[i].second;
  30. q.push(cows[i].second);
  31. if (q.size() >(n - 1) / 2)
  32. {
  33. res -= q.top();
  34. q.pop();
  35. }
  36. }
  37. while (!q.empty()) q.pop();
  38. res = 0;
  39. for (int i = c-1; i >=0; i--)
  40. {
  41. if (q.size() == (n - 1) / 2)
  42. rcow[i] = res;
  43. else
  44. rcow[i] = INF;
  45. res += cows[i].second;
  46. q.push(cows[i].second);
  47. if (q.size() > (n-1) / 2)
  48. {
  49. res -= q.top();
  50. q.pop();
  51. }
  52. }
  53. for (int i = c-1; i >=0; i--)
  54. {
  55. if (lcow[i] + rcow[i] + cows[i].second <= f)
  56. {
  57. ans = cows[i].first;
  58. break;
  59. }
  60. }
  61. printf("%d\n", ans);
  62. return 0;
  63. }

自补:
poj 2823

n个长度队列,k长度滑块每次从左向右滑动1长度,求这个序列中的最小值与最大值,并输出这个最小值和最大值分别构成的序列
解法:单调队列Or线段树,使用双端队列维护下标,这里若直接使用优先队列会tle

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. const int maxn = 1e6+5;
  5. using namespace std;
  6. int b[maxn],a[maxn],c[maxn];
  7. int deq[maxn];
  8. int n,k;
  9. void getmin()
  10. {
  11. int s=0,t=0;
  12. for(int i=0;i<n;i++)
  13. {
  14. while(s<t&&a[deq[t-1]]>=a[i]) t--;
  15. deq[t++]=i;
  16. if(i-k+1>=0)
  17. {
  18. b[i-k+1]=a[deq[s]];
  19. if(deq[s]==i-k+1)
  20. s++;
  21. }
  22. }
  23. for(int i=0;i<=n-k;i++)
  24. {
  25. printf("%d%c",b[i],i==n-k?'\n':' ');
  26. }
  27. }
  28. void getmax()
  29. {
  30. int s=0,t=0;
  31. for(int i=0;i<n;i++)
  32. {
  33. while(s<t&&a[deq[t-1]]<=a[i]) t--;
  34. deq[t++]=i;
  35. if(i-k+1>=0)
  36. {
  37. b[i-k+1]=a[deq[s]];
  38. if(deq[s]==i-k+1)
  39. s++;
  40. }
  41. }
  42. for(int i=0;i<=n-k;i++)
  43. {
  44. printf("%d%c",b[i],i==n-k?'\n':' ');
  45. }
  46. }
  47. int main()
  48. {
  49. int s=0,t=0;
  50. cin>>n>>k;
  51. for(int i=0;i<n;i++)
  52. cin>>a[i];
  53. getmin();
  54. memset(deq,0,sizeof(deq));
  55. getmax();
  56. return 0;
  57. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注