ICPCアジア瀋陽2019 F.鳴らすのプールのための予備コンテスト

トピックへのリンク:https://nanti.jisuanke.com/t/41406

考える:kは数日間のために十分な大きさであれば、すべては二つの状況をシンクする傾向があります。

①すべてのプールが同じレベルである、すなわち、平均水位であります

プールだけ高さの最高水位の高低差のプール②最低水位と最低水位は平均水位でなければなりません

kは制限を与えた場合:

もちろん、我々はすべてのプールの高さの平均値を計算する必要があります。

次にローからハイにソートされ、水位が、半分以下の平均2点平均水位より上であります

その後、kに等しい未満を要する日数の半分の数の期待値か否かを判定する。そして、半分は最低の最大水位を見つけるために、

最高レベルの最小値は、減算の両方が答えです。


1の#include <iostreamの>
 2の#include <CStringの>
 3の#include <アルゴリズム>
 4の#include <cstdioを>
 5の#include <地図>
 6  の#define()I =(J int型のための担当者(I、J、K)。 iが<=(k)を; ++ i)が
 7  の#defineあたり(i、j、k)を(I =(J int型用); I> =(K); --I)
 8  の#defineのrep __(I、J iが<(k)を; ++ i)から(iは=(J INT)のために、K)
 9  の#define - ; I; __あたり((INT iは=(jに対するI、J、K))>(K) I)
 10  の#defineのINF 1E9
 11  使って 名前空間STDを、
12 typedefの長い 長いLL。
13 const  int型 N = 500010 ;
14  
15  int型ARR [N]、K、N。
16  LL和、AVE。
17  
18  ブールチェック(INT半ば、int型の選択){
 19      int型の和= 0 20      であれば(選択== 1){ // 大于平均值的
21          担当者(I、1 、N){
 22              であれば(ARR [I]> = MID)ブレーク23              和+ =(MID - ARR [I])。
24          }
 25      }
26は、      { // の平均よりも小さい
27          あたり(I、N - 、1 ){
 28              IF(ARR [I] <= MID)BREAK ;
 29              - (ARR [I] SUM + = ; MID)
 30          }
 31れる     }
 32  
33で     IF(SUM <= K)リターン trueに34は     他の 戻り falseに;
 35  }
 36  
37 [  INT {main()の
 38が 
39      ながら(〜scanfの(" %のD "&、N-)){
 40         SUM = 0 ;
 41である          scanfの(" %のD "、&K);
 42は、          REP(I、1 、N-){
 43は              scanfの(" %のD "、ARR + I)、
 44は              + = SUM ARR [I];
 45          }
 46は、         
47          ソート(ARR + 1、ARR + 1 + N-);
 48          アヴェ= SUM / N-;
 49  
50          のint l_end、r_start; // 平均の最大レベル以下に最小水位、平均以上
51         = l_end アベニュー、
 52である          SUM N-%の== 0 r_start =アヴェ:? r_start =アヴェ+ 1 ; // 二等分線でき
53は         
54である         INT ; ans_1、ans_2
 55          INT L = ARRの[ 1 ]; // 左境界
56である         int型の R&LT l_end =; // 右境界
57が         INT MID;
 58          ながら(L <= R&LT){
 59              MID =(L + R&LT)>> 1。;
 60              IF((MID、チェック1。 )){
 61が                  ans_1 = MID。
62は                  L = MID + 。1 ;
 63である             }
 64              他の R&LT MID = - 1 ;
 65          }
 66  
67          L = r_start; // 左境界
68          R&LT = [N-] ARR; // 右境界
69          ながら(L <= R&LT){
 70              MID =(L + R&LT)>> 1 ;
 71である             IF((MID、チェック2 ))を{
 72                  ans_2 = MID;
 73である                  R&LT MID = - 1。;
 74             }
 75               L =ミッド+ 1 76          }
 77  
78          のprintf(" %d個の\ n "、ans_2 - ans_1)。
79      }
 80  
81      GETCHAR(); GETCHAR()。
82      リターン 0 ;
83 }

 

おすすめ

転載: www.cnblogs.com/SSummerZzz/p/11580811.html