1004—p1m2
1004—p1m2
題目:
p1m2
? ?Accepts: 1003 ? ?Time Limit: 2000/1000 MS (Java/Others) ? ?Memory Limit: 131072/131072 K (Java/Others) Problem Description度度熊很喜歡數組!!
我們稱一個整數數組為穩定的,若且唯若其同時符合以下兩個條件:
舉例而言,[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
對于每一組測試數據,請依序各自在一行內輸出一個整數,代表可能到達的平衡狀態中最大的『數組中的最小值』,如果無法達成平衡狀態,則輸出?-1?1。
Sample Input 2 3 1 2 4 2 0 100000000 Sample Output Copy 2 33333333?
?
思路:
? ? ?直接二分答案即可,對于每個答案,計算原來數組需要加1的操作次數以及需要減2的操作次數,通過比較兩者的大小來縮小上界或下界。時間復雜度為O(nlog(n))。
?
代碼:
#include <cstdio> #include <algorithm> using namespace std; const int MAXN = 3e5+20; typedef long long ll; ll a[MAXN], n;ll check(ll ans) {ll t1=0, t2=0; ///t1表示需要加1的操作次數,t2表示需要減2的操作次數for(int i=1; i<=n; i++){if(ans>a[i]){t1+=(ans-a[i]);}else if(ans<a[i]){t2+=(a[i]-ans)/2;}}return t1<=t2;}int main() {int t;scanf("%d", &t);while(t--){scanf("%d", &n);for(int i=1; i<=n; i++)scanf("%I64d", &a[i]);ll l = 0, r = 1e9;while(l+1< r){ll mid = (l + r) >> 1;if(check(mid)){l = mid;}else{r = mid;}}printf("%I64d\n", l);}return 0; }?
轉載于:https://www.cnblogs.com/longl/p/9466445.html
總結
- 上一篇: HDU 6321 Problem C.
- 下一篇: Ocean的礼物(线段树单点修改)