zoukankan      html  css  js  c++  java
  • POJ_2010 Moo University

    一、题面

    POJ2010

    二、分析

    堆预处理

    首先可以考虑吧随便取一个点,判断两侧的最小的总费用是多少,然后相加判断是否满足条件。如果直接判断会超时,所以需要用大根堆预处理一下。先看从分数最小的往最大的预处理,先取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 }
    View Code
  • 相关阅读:
    QQ视频直播架构及原理 流畅与低延迟之间做平衡 音画如何做同步?
    边缘推流与中心推流对比
    推流协议 支持RTMP协议推流
    改变原型
    window.onbeforeunload 埋点 页面停留时间
    修改/etc/hosts 云服务器 没有做外网转内网的优化
    :nohlsearch
    z waiting to receive.**B0100000023be50
    Powered by Flink
    负载均衡
  • 原文地址:https://www.cnblogs.com/dybala21/p/10132984.html
Copyright © 2011-2022 走看看