トピックリンク:https://zoj.pintia.cn/problem-sets/91827364500/problems/91827370312
あなたが注ぐたびにすぐそこにあなたの家族のn土地の部分で、各土地が1メートルで区切られた上で、土地の最初の部分は、家から離れて1メートルで区切られた、と今は自宅ロボットから開始し、土地の水やりに行き、ロボットが動く1メートル:質問の意味します水、土地のi番目のブロックごとに一度注ぎ水[i]は、防衛値、全体的な防衛値を増やしN土地の防衛値の最も小さい部分で、今あなただけ行くことができるロボットM M M Mあなたに仕上がりを求めます全体の防御値の後に可能な最大数です。
思考:防御を最大化考え半分最小L = 0、最大値R = 1E17、i番目のブロックのための土地、それは確かにロボットでiは各ブロック陸に到達するまで、IとI + 1との間で前後に移動させ値は、土地の最初の部分に対応するI + 1は、散水の数を増加させるであろう。
書式#include <stdio.hに> する#include <iostreamの> 書式#include < 文字列の.h> の#include <math.h>の 書式#include < 文字列 > の#include <アルゴリズム> 書式#include <キュー> の#include <マップ> typedefの長い 長いLL ; 使用して 名前空間はstdを、 LL [ 200005 ]。 LL楽しい(LL半ば、LL N、LL M) { LL和 = 0 。 LL ANS = 0 。 以下のために(INT iが= 1 ; I <= N; I ++) { LL X = MID / A [i]が、 IF(MIDの%のA [i]が!= 0 ) X ++ ; IF(X <= SUM)// i番目MID達した { SUM = 0 ; IFを( I <N-)// もしI <N iは== N、中間、移動する必要到達したであろう場合まず、第1から移動されるI-1 ANS ++を; } 他 { X - = SUM; // 数マイナス散水の必要数 ANS ANS + = 2 * X- 1 ; // 完成注入所望の周波数ブロックI = X-和1。 ; // 最初のブロックI + 1 Ciが注が和に対応 } IF(ANS> M)は// ANSがmより大きくなっており、それは確かではない場合 、戻り 0 ; } IF(ANS> M) 戻り 0 ; リターン 1 ; } int型のmain() { int型T; scanfの(" %のD "、&T)、 一方(T-- ) { LL N-、M; scanfの(" %% LLD LLD "、およびN- 、&M)。 用(INT I = 1 ; I <= N; I ++ ) scanfの(" %のLLD "、&A [I]); LL L = 0は、R = 100000000000000007 ; LL ANS; ながら(L <= R&LT) { LL MID = (L + R&LT)/ 2 ; IF(MID == 0)// MID = 0は確かに確立され、必ずしもそうではないが確立された楽しみに機能している { ANS = MID; L = MID + 1。; 続行; } であれば(FUN(中間、n、m)は== 1 ) { ANS = ミッド。 L =ミッド+ 1 。 } 他 R =半ば1 。 } のprintf(" %のLLD \ n " 、ANS)。 } }