題目1 二分 二分查詢

2021-06-29 00:04:55 字數 2698 閱讀 5287

時間限制:

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

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

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

#include #include #include #include using namespace std;

int bsearch(int target, vector&a, int n)

if (a[left] == target) //這裡實質上是需要判斷left是否在陣列範圍內的,對於特殊資料會出現問題的

return left;

else

return -1;

}vectorvec;

int main()

if (hasv)

printf("%d", t);

else

printf("-1\n");

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

vec.resize(n);

for (int i = 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;

int quicksort(int a,int target, int left, int right)//這個演算法對有重複數的陣列應該是不行的吧

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)

#include #include #include using namespace std;

int num[1000000];

int bsearch(int low, int high, int target)

int mid = num[low];

int left = low;

int right = high;

//這裡能針對重複數陣列

while (left < right)

if (mid < target)

return bsearch(left + 1, high, target);

else

return bsearch(low, left - 1, target);

}int main(void)

題目1 二分 二分查詢

link 時間限制 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 開始,通過對待查詢的值與候選區中間值的比較,可以使候選區減少一半。二分查...