【二分】bestcoder p1m2
阿新 • • 發佈:2018-08-12
mar d+ tom text 所有 pri div 條件 最大的
模型的轉化和二分check的細節挺不錯的
Problem Description
度度熊很喜歡數組!!
我們稱一個整數數組為穩定的,若且唯若其同時符合以下兩個條件:
- 數組裏面的元素都是非負整數。
- 數組裏面最大的元素跟最小的元素的差值不超過 11。
舉例而言,[1, 2, 1, 2][1,2,1,2] 是穩定的,而 [-1, 0, -1][−1,0,−1] 跟 [1, 2, 3][1,2,3] 都不是。
現在,定義一個在整數數組進行的操作:
- 選擇數組中兩個不同的元素 aa 以及 bb,將 aa 減去 22,以及將 bb 加上 11。
舉例而言,[1, 2, 3][1,2,3] 經過一次操作後,有可能變為 [-1, 2, 4][−1,2,4] 或 [2, 2, 1][2,2,1]。
現在給定一個整數數組,在任意進行操作後,請問在所有可能達到的穩定數組中,擁有最大的『數組中的最小值』的那些數組,此值是多少呢?
Input
輸入的第一行有一個正整數 TT,代表接下來有幾組測試數據。
對於每組測試數據: 第一行有一個正整數 NN。 接下來的一行有 NN 個非負整數 x_ix?i??,代表給定的數組。
- 1 \le N \le 3 \times 10^51≤N≤3×10?5??
- 0 \le x_i \le 10^80≤x?i??≤10?8??
- 1 \le T \le 181≤T≤18
- 至多 11 組測試數據中的 N > 30000N>30000
Output
對於每一組測試數據,請依序各自在一行內輸出一個整數,代表可能到達的平衡狀態中最大的『數組中的最小值』,如果無法達成平衡狀態,則輸出 -1−1。
Sample Input
2 3 1 2 4 2 0 100000000Sample Output
2 33333333
題目分析
二分的check細節精巧
1 #include<bits/stdc++.h> 2 const int maxn = 300035; 3 4 int T,n,ans,mx,mn,l,r; 5 int a[maxn]; 6 7 int read() 8 { 9 char ch = getchar(); 10 int num = 0; 11 bool fl = 0; 12 for (; !isdigit(ch); ch = getchar()) 13 if (ch==‘-‘) fl = 1; 14 for (; isdigit(ch); ch = getchar()) 15 num = (num<<1)+(num<<3)+ch-48; 16 if (fl) num = -num; 17 return num; 18 } 19 bool check(int x) 20 { 21 long long cnt = 0; 22 for (int i=1; i<=n; i++) 23 if (a[i] <= x) cnt += x-a[i]; 24 else cnt -= (a[i]-x)/2; 25 return cnt <= 0; 26 } 27 int main() 28 { 29 T = read(); 30 while (T--) 31 { 32 n = read(), ans = -1, mx = 0, mn = 2e9; 33 for (int i=1; i<=n; i++) a[i] = read(), mx = std::max(mx, a[i]), mn = std::min(mn, a[i]); 34 l = mn, r = mx; 35 for (int mid=(l+r)>>1; l<=r; mid=(l+r)>>1) 36 if (check(mid)) ans = mid, l = mid+1; 37 else r = mid-1; 38 printf("%d\n",ans); 39 } 40 return 0; 41 }
END
【二分】bestcoder p1m2