Time 2000ms RAM 32767K
題面:
蒜頭君在和他的朋友們一起玩一個游戲。由于蒜頭君的機智,這個 游戲由蒜頭君擔任裁判。
首先,蒜頭君會給他們一人一個編號,并且每個人的編號都不相同。接下來的每一回合,蒜頭君會給一個數,編號不超過它的最大編號的人要報出自己的編號。如果沒有人的編號比蒜頭君給出的數要小,那么編號最小的人要報出自己的編號。每個人可以重復報號。
蒜頭君會按照一個列表順次報出每個回合的數,他的朋友們想知道每回合報出的編號應該是多少。你能幫幫他們嗎?
輸入格式
輸入數據共 3 行。第一行有兩個整數 n,m (1≤ n ≤ 10^5,1 ≤ m ≤ 10^5),分別表示參與游戲的蒜頭君朋友的個數,和游戲的回合數。
第二行 n個整數ai(1 ≤ ai ≤ 10^8),表示朋友們每個人的編號。
第三行 m 個整數qi(1 ≤ qi ≤ 10^8),表示每回合蒜頭君給的數字。
輸出格式
輸出共一行,輸出 m個整數,表示每回合報出的編號。每兩個整數之間有一個空格,最后一個整數后面沒有空格。
樣例輸入
5 5 1 5 10 15 20 3 6 12 18 24
樣例輸出
1 5 10 15 20
思路:
將輸入分別儲存為 編號數組 和 報數數組 ,為了提高查找效率,先將編號數組排序,然后用二分查找算法在已排序的數組中找數。
分析:
- 由于輸入的數組長度不確定,相比于開創一個巨大的數組,更好的選擇是使用
vector
容器儲存數據; - 排序算法可以自己實現一種算法(如冒泡法,歸并法),也可以使用
qsort
或者std::sort
實現; - 查找算法我們選擇二分查找法。
實現(C++):
#include<iostream>
#include<vector>
#include<algorithm>
using std::cout;
using std::cin;
using std::endl;
using std::sort;
using std::vector;
int binsearch(vector<int>&a, int lef, int rig, int e) {
while (lef <= rig) {
int mid = (lef + rig) >> 1;
if(a[mid] > e) rig = mid - 1;
else lef = mid + 1;
}
if(rig<0)rig=0;
return rig;
}
int main() {
//n:參與人數,m:游戲回合數
int n,m;
cin >> n >> m;
vector<int>array1;
vector<int>array2;
//輸入
int input;
for(int i=0;i<n;i++) {
cin >> input;
array1.push_back(input);
}
for(int i=0;i<m;i++) {
cin >> input;
array2.push_back(input);
}
//排序
sort(
&array1[0],
&array1[n]
);
//二分法查找
int output;
for(int i=0;i<m;i++) {
output = binsearch(array1,0,n-1,array2[i]);
if(i==m-1) {
cout << array1[output] <<endl;
}
else {
cout << array1[output] <<" ";
}
}
return 0;
}
Note:
- 第一次提交的時候幾乎全錯了。情形如下:
出現了編號數組中未出現的0,于是在rig
返回前插入輸出,發現rig = -1
于是在return rig;
前加入判斷,完成。
terminal
- 第二次提交時前五個正確,后五個超時了。原因是原先
binsearch()
函數使用的是vector<int>a
形參,形實結合時是值傳遞,導致額外的一次拷貝操作,帶來的時間開銷非常大。改成引用作為形參:vector<int>&a
,完成。另外,使用vector
前,
#include<vector>
using std::vector;
- 向
vector
中填充數據,比較好的做法是:
int input;
for(int i=0;i<n;i++) {
cin >> input;
array1.push_back(input);
}
而不是:
for(int i=0;i<n;i++) {
cin >> array[i];
}
因為后者存在著數組越界的隱患。
-
std::sort
的使用:
#include<algorithm>
using std::sort;
...
//舉例1
vector<int> a = { 2, 4, 5, 3, 1 };
sort(
begin(a),
end(a),
[](int x, int y){ return x >= y; }
);
//舉例2
vector<int>b;
cin << n;
int input;
for(int i=0;i<n;i++) {
cin >> input;
b.push_back(input);
}
sort(
&b[0],
&b[n],
[](int x, int y){ return x < y; }
);