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