問題の意味
https://vjudge.net/problem/CodeForces-1250B
誰もが有人容量*数は、最小コストを尋ねるAI、車のコストで2つのチーム(フル)まで運ぶ車のチームに属しています。
思考
K(チームの数)だけ8,000、この条件からこの話題を開始します。最初の大小規模の数に応じて各チームは、次に[k]は、車両の最小容量であり、我々は、L = 1の端部から、R = Kで、I [k]の開始からの車両の容量を列挙することができるように配列Aを、次に、もし[L] + [R] <= I、L ++、r--の、そうでない場合r--のことは、最初のチームの人々の多くを行います。しかし、もし車容量が非常に病気TLEため、データ次いで、[K] + [K-1]が設けられています。だから、容量の列挙を最適化するために、私たちの貪欲な割り付けチームの車は、通常の最小者の最大数を作り、上のすなわち、[1] + [K]、[2] + [K-1] 、......限り最大値は、これらの車両の容量の上限です。
コード
#include <ビット/ STDC ++ H> 名前空間STDを使用して、 #define INF 0x3f3f3f3f の#define LL長い長 のconst int型N = 5E5 + 5。 const int型MOD = 1E9 + 7。 constのダブルEPS = 1E-8; constのダブルPI = ACOS(-1.0); #define lowbit(X)(X&( - X)) LL [N]。 int型のmain() { のstd ::イオス:: sync_with_stdio(偽); LL N、K。 CIN >> N >> K。 以下のために(INT I 1 =; I <= N; I ++) { int型のX; cinを>> X; [X] ++; } もし(K == 1) { COUT << [1] << ENDL。 0を返します。 } LL MX = 0。 (INTのためにI 1 =; I <= K。 { MX = MAX(MX、[I] + [K-I + 1])。 } ソート(+ 1、+ 1 + K)。 LL RES = 1E16; 以下のための(iは[k]を= LL; I <= MX; I ++) { LL L = 1、R = K、CNT = 0。 (L <R)、一方 { CNT ++。 ([L] + [R] <= 1)であれば 、L ++、r--の。 他の r--の; } (L == R)の場合 、CNT ++。 RES =分(RES、iはCNT *)。 } COUT << RES << ENDL。 0を返します。 }