二分查詢習題

2021-08-24 17:57:10 字數 1671 閱讀 7396

度度熊很喜歡陣列!! 

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

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

2. 陣列裡面最大的元素跟最小的元素的差值不超過 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 個非負整數 xixi,代表給定的陣列。

* 1≤n≤3×1051≤n≤3×105 

* 0≤xi≤1080≤xi≤108 

* 1≤t≤181≤t≤18 

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

output

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

sample input

2

31 2 4

20 100000000

sample output

2

33333333

這道題一開始題意都理解不好,尤其是那個「代表可能到達的平衡狀態中最大的『陣列中的最小值』」,這麼繞口。。。

好了,不吐槽了

其實就是讓你找平衡狀態時,陣列中的最小值,達到平衡時陣列中也就倆數,因為要保證最大值最小值之差小於1

解題的思路是這樣的,總體上是用的二分法,先找出陣列中的中間值,接著遍歷陣列中的每個元素,如果小於陣列,x加上這個差,如果大於陣列,y加上這個差的一半;最後比較這兩個數的大小,就是二分的步驟。

大概就是這樣,要加把勁了

補充乙個小知識點:

關於%i64d和%lld的問題

兩種都是c語言中格式化輸出64位整型的正確做法。

區別在於編譯器不同。

gcc(mingw32),g++(mingw32)只支援%i64d的輸出方式。 

gcc(linux i386),g++(linux i386)只支援%lld的輸出方式。

另外,mac上的gcc/g++不支援%i64d的方式。

最後把**碼一遍吧

#include#include#define maxn 300010

#define ll long long

ll a[maxn];

using namespace std;

int main()

ll mid;

ll l=0;

ll r=0;

while(l+1a[i])

if(r=y)else

} printf("%l64d",l);

}}

習題1 8 二分查詢 20分

習題1.8 二分查詢 20分 思路分析 核心是在已經排序好的數列中找到中位數,然後把要找的數和中位數比較,然後收縮左右邊界,最後找到那個數字。注意要判斷這個數是否在這個線性表中,找不到就返回 notfound 函式介面 define maxsize 10000 typedef int positio...

習題1 8 二分查詢 20分

l是使用者傳入的乙個線性表,其中elementtype元素可以通過 進行比較,並且題目保證傳入的資料是遞增有序的。函式binarysearch要查詢x在data中的位置,即陣列下標 注意 元素從下標1開始儲存 找到則返回下標,否則返回乙個特殊的失敗標記notfound。while l r else ...

習題1 8 二分查詢 20分

本題要求實現二分查詢演算法。position binarysearch list l,elementtype x 其中list結構定義如下 typedef int position typedef struct lnode list struct lnode l是使用者傳入的乙個線性表,其中elem...