題目1 二分 二分查詢

2021-06-29 02:22:55 字數 2559 閱讀 9891

link:

時間限制:

10000ms

單點時限:

1000ms

記憶體限制:

256mb

描述nettle最近在玩《艦これ》,因此nettle收集了很多很多的船(這裡我們假設nettle氪了很多金,開了無數個船位)。去除掉重複的船之後,還剩下n(1≤n≤1,000,000)種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有值都不相同,稀有值越小的船越稀有,價值也就越高。

nettle現在通過大建又造出了一艘船,他想知道這艘船是不是重複的。如果是重複的,那麼這艘船在nettle所有的船裡面稀有值排多少位。

問題一 nettle已經先把自己所有船按照稀有值從小到大排列好了(a[1..n]),我們要做的是看看新得到的船(假設稀有值為k)是否在這個序列中,且有對應的a[i]=k時,i為多少?

提示一:有序陣列的二分查詢

問題二 因為nettle的船太多了,他不願意去給所有船按照稀有值排序,而是直接告訴了我們每一艘船的稀有值。在這種情況下我們該如何解決這個問題呢?

提示二:非有序陣列的二分查詢

輸入第1行:2個整數n,k。n表示陣列長度,k表示需要查詢的數;

第2行:n個整數,表示a[1..n],保證不會出現重複的數,1≤a[i]≤2,000,000,000。

輸出第1行:乙個整數t,表示k在陣列中是第t小的數,若k不在陣列中,輸出-1。

樣例輸入

10 5180

2970 663 5480 4192 4949 1 1387 4428 5180 2761

樣例輸出

9

[cpp]view plain

copy

//有序排序陣列的二分查詢,可能存在重複的數

//查詢某一值在排序陣列中的第乙個位置

#include 

#include 

#include 

#include 

using

namespace

std;  

intbsearch(

inttarget, vector<

int> &a, 

intn)  

if(a[left] == target)  

return

left;  

else

return

-1;  

}  vector> vec;  

intmain()  

if (hasv)

printf("%d", t);

else

printf("-1\n");

*///上面的方法沒有使用到題目要使用的非有序陣列的二分查詢

vec.resize(n);  

for(

inti = 0; i < n; ++i)  

scanf("%d"

, &vec[i]);  

sort(vec.begin(), vec.end());  

/*int i = 0;

while (i < n && vec[i] < k)

++i;

if (vec[i] == k)

printf("%d\n", i);

else

printf("-1\n");

*/int

i = 0;  

for(i = 0; i < n && vec[i] < k; ++i);  

if(i < n && vec[i] == k)  

printf("%d\n"

, i);  

else

printf("-1\n"

);  

//printf("%d\n", bsearch(k, vec, n));

return

0;  

}  //使用非有序陣列的二分查詢,借鑑快速排序的演算法,快速排序演算法在筆試和面試題中很容易問到,基本就是選取乙個值,將比這個值小的數放到左邊,將比這個值大的數放到右邊,一般這個值的選取可以自己決定,怎樣實現這其中的演算法呢

//分別從左從右找不符合條件的數,然後交換

#include 

#include 

using

namespace

std;  

intquicksort(

inta,

inttarget, 

intleft, 

intright)

//這個演算法對有重複數的陣列應該是不行的吧

if(value == target)  

return

low + 1;  

else

if(value > target)  

return

quicksort(a, target, left, low - 1);  

else

return

quicksort(a, target, high + 1, right);  

}  int

main(

void

)    

題目1 二分 二分查詢

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...

二分查詢與二分答案(1)

我們在寫程式的時候,經常會遇到這樣一類問題 在乙個陣列中查詢乙個數是不是存在。比如在下圖的陣列中,查詢8是不是存在 如果不要求效率,我們最一般的查詢方法就是順序查詢,依次檢視a 0 a 1 a n 1 檢查是不是等於8。這樣對於長度為n的陣列,平均查詢長度是n 2 如果陣列是有序的,比如是遞增的,就...

1 二分查詢

遞迴的兩個特點 呼叫自身 結束條件 列表查詢 從列表中查詢指定元素 輸入 列表 待查詢元素 輸出 元素下標或未查找到元素 順序查詢 從列表第乙個元素開始,順序進行搜尋,直到找到為止。二分查詢 從有序列表的候選區data 0 n 開始,通過對待查詢的值與候選區中間值的比較,可以使候選區減少一半。二分查...