トピックへのリンク: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 }