計蒜客T1156 查詢最近的元素 二分

2021-10-09 14:49:17 字數 1369 閱讀 8971

題目貼上:

在乙個非降序列中,查詢與蒜頭君的給定值最接近的元素。

輸入格式

第一行包含乙個整數 n,為非降序列長度。1≤n≤100000。

第二行包含 n 個整數,為非降序列各元素。所有元素的大小均在 0∼1,000,000,000 之間。

第三行包含乙個整數 m,為要詢問的給定值個數。1≤m≤10000。

接下來 m 行,每行乙個整數,為要詢問最接近元素的給定值。所有給定值的大小均在 0∼1,000,000,000 之間。

輸出格式m行,每行乙個整數,為最接近相應給定值的元素值,保持輸入順序。若有多個值滿足條件,輸出最小的乙個。

sample input

32 5 8210

5sample output85

題目思路:

我們可以把問題這樣子拆解:題目給定乙個目標數,要求在陣列裡面找乙個數使得兩者之差絕對值最小且此時在陣列裡面找到的數盡量小,我們分別找兩個數:大於或等於目標數的最小數,小於或等於目標數的最大數。但我們沒必要去兩次二分,我們直接求最小數,而最大數一定是和最小數相鄰的。

但應該考慮一種特殊情況,如果陣列裡面所有的數都比目標數大的時候,我們應該直接輸出陣列裡面最小的數。

**

#include

#include

#include

#include

#include

const

int max =

1e6+10;

const

int inf =

0x7fffffff

;typedef

long

long

int ll;

using

namespace std;

ll a[max]

;int n, k, m,score;

ll cnt =0;

void

sovle()

//查詢最後乙個最小的數字

if(score < a[0]

)//如果陣列裡面所有的數都比目標數要大輸出陣列裡面最小的數

cout <<((

abs(a[r -1]

- score)

>

abs(a[r]

- score))?

a[r]

: a[r -1]

)<< endl;

}int

main

(void

)return0;

}

折騰筆記 計蒜客t1156AC記

歡迎檢視原題位址 此題思路 最初版 暴力,得出最相近的,1000ms呢,除非資料超大,否則不超時。說明 爆搜,搜出結果,時間複雜度基本 o n 2 注 本文所有時間 與空間 複雜度僅為估計,不排除坑爹資料卡大複雜度的可能 include using namespace std bool kkk in...

計蒜客 刪除最少的元素

問題描述 給定有 n 個數的 a 序列 a1,a2,a3 an 對於這個序列,我們想得到乙個子串行 ap1,ap2 api apm 1 p1 p2 pi pm n 滿足 ap1 ap2 api apm 從 a 序列最少刪除多少元素,可以得到我們想要的子串行。輸入格式 第一行輸入乙個整數 n,代表 a...

計蒜客 L2查詢 查詢最接近的元素

這題很多萌新一看就說 簡單,乙個lower bound解決所有問題。include include include using namespace std int num 100005 intmain cin m int p1 while m return0 結果 那麼,到底怎麼回事呢?第一步,檢查...