CCF NOI 1044 最近元素

2021-08-14 11:21:24 字數 1066 閱讀 4288

題目描述

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

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

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

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

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

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

樣例輸入

3 2 5 8

2 10

5樣例輸出 8 5

解題思路

非降序列,可以採用二分查詢,這樣每次查詢的複雜度可以降到log級別。

查詢可能找到那個元素,也可能找不到,即使找不到,也要返回乙個最接近的。因此,為了方便寫**,我們可以把他們合併在一起,即找最接近的2個元素,誰更接近就輸出誰(如果找到的話,相等的更接近),這樣可以避免很多細微的容易出錯的地方。

**中,find函式退出迴圈時,l+1等於r,l是1或者a[l]比k小,r是n或者a[r]不比k小。**中,find函式退出迴圈時,l+1等於r,l是1或者a[l]比k小,r是n或者a[r]不比k小。如果k在a[1]和a[n]之間,那麼a[l]<=k<=a[r],否則a[l]<=a[r]

#include 

#include

#include

using

namespace

std;

int a[1000009];

int search(int l,int r,int k)

if(abs(a[r]-k)return a[r];

else

return a[l]; //包含兩種情況,一種是大於,一種是等於,等於的時候輸出小的那個,因為l會小於r,所以輸出a[l]

}int main()

CCF NOI1012 變換密碼

問題鏈結 ccf noi1012 變換密碼 時間限制 1000 ms 空間限制 262144 kb 題目描述 一密碼變換規則如下 乙個正整數對應乙個字元 如果該數模123的值在97 122範圍,變換為ascii為該餘數對應的小寫字元 如果變換不了小寫字元,將該數模91,若餘數在65 90範圍,變換為...

CCF NOI1016 計算天數

問題鏈結 ccf noi1016 計算天數 時間限制 1000 ms 空間限制 262144 kb 題目描述 輸入年份與月份,求該月共有多少天。輸入 輸入兩個空格隔開的正整數year和month,分別表示年份和月份。輸出 輸出對應year這一年month這個月的天數。樣例輸入 2000 2 樣例輸出...

CCF NOI 1034 鈔票兌換

題目描述 將任意給定的整百元鈔票,兌換成10元 20元 50元小鈔票形式。輸出兌換方案總數。輸入 輸入需要兌換的鈔票總數n。輸出 輸出方案總數。樣例輸入 100樣例輸出 10我們首先想到的就是暴力列舉法,但是,在oj上執行超時了,所以,我們要用數學方法去優化一下。源 時間複雜度過大,大資料會超時 i...