HDU 6383,二分演算法

2021-08-25 16:38:04 字數 1530 閱讀 6130

度度熊很喜歡陣列!! 

我們稱乙個整數陣列為穩定的,當且僅當其同時符合以下兩個條件: 

1. 陣列裡面的元素都是非負整數。 

2. 陣列裡面最大的元素跟最小的元素的差值不超過 1。

舉例而言,[1,2,1,2] 是穩定的,而 [?1,0,?1] 跟 [1,2,3] 都不是。 

現在,定義乙個在整數陣列進行的操作: 

* 選擇陣列中兩個不同的元素 a 以及 b,將 a 減去 2,以及將 b 加上 1。 

舉例而言,[1,2,3] 經過一次操作後,有可能變為 [?1,2,4] 或 [2,2,1]。 

現在給定乙個整數陣列,在任意進行操作後,請問在所有可能達到的穩定陣列中,擁有最大的『陣列中的最小值』的那些陣列,此值是多少呢? 

input

輸入的第一行有乙個正整數 t,代表接下來有幾組測試資料。 

對於每組測試資料: 

第一行有乙個正整數 n。 

接下來的一行有 n 個非負整數 xi,代表給定的陣列。

* 1≤n≤3×105 

* 0≤xi≤108 

* 1≤t≤18 

* 至多 1 組測試資料中的 n>30000

output

對於每一組測試資料,請依序各自在一行內輸出乙個整數,代表可能到達的平衡狀態中最大的『陣列中的最小值』,如果無法達成平衡狀態,則輸出 ?1。

sample input

2

31 2 4

20 100000000

sample output

2

33333333

這個題的意思是,

乙個給你乙個陣列,找到不同的兩個數乙個減2,乙個加1,然後求穩定陣列中,最小值最大的那個數。、

乍一看這個題,不是emmmmm。。。好吧我不會,上網各種搜題解,終於看懂

下面是參考大佬的思路

你找到陣列中最大的和最小的數,你需要求的數肯定在這裡面,

然後定義乙個temp用來判斷提高序列的最小值或減少序列的最大值,

(這個意思就是,向中間靠攏,如果最後的 temp>0,就是說,這個當發現 mid 的值較小,也就是說所有大於 mid 的數仍有提高序列最小值的能力(同時要滿足題意)

,那麼就令 l = mid +1;

若 mid 的值較大,所有大於 mid 的數無法通過減小自身來提高較小的數時

, 則令 r = mid - 1。)

#include#include#include#includeusing namespace std;

typedef long long ll;

ll num[300005];

int main ()

while(r>=l)

if(temp>=0) l=mid+1;//提公升最小值(說明mid取小了)

else r=mid-1;//減少最大值(說明mid取大了)

} printf("%d\n",r);

} return 0;

}

HDU 6383 p1m2 百度之星(二分)

度度熊很喜歡陣列!我們稱乙個整數陣列為穩定的,當且僅當其同時符合以下兩個條件 1.陣列裡面的元素都是非負整數。2.陣列裡面最大的元素跟最小的元素的差值不超過 11。舉例而言,1,2,1,2 1,2,1,2 是穩定的,而 1,0,1 1,0,1 跟 1,2,3 1,2,3 都不是。現在,定義乙個在整數...

hdu1669 二分多重匹配 二分

n個人分成m組,求人數最多的那一組人數的最小值。每個人肯定只能匹配乙個組,但乙個組可以匹配多個人,因此屬於多重匹配。我們設定乙個limit,表示每組最多能容納的人數。在dfs u 尋找u的匹配時,如果某一組vv的人數小於limit,那麼可以把u和vv匹配,vv已經匹配的人數 1。否則,當人數已經達到...

演算法基礎 二分查詢函式 二分演算法

一 寫乙個函式binaryseach,在包含size個元素的 從小到大排序的int數a裡查詢元素p,如果找到,則返回元素下標,如果找不到,則返回 1。要求複雜度o log n int binarysearch int a,int size,int p return 1 複雜度o log n 二 寫乙...