用python容易超時,不超時的話要用外部額外排序list套件,但要用到外部套件就不是個好選擇了,所以這裡提供用python表示想法,會用C++來實作
想法
仔細想想就會發現這題比較沒辦法用雙指針(因為涉及刪除)。
所以這裡的想法是
” 將顧客的預算插入到票價list中,取左邊那個 “
這樣就能取到<=票價的最優價格了
import bisect
n, m = map(int, input().split())
s = sorted(list(map(int, input().split())))
customers = list(map(int, input().split()))
for c in customers:
i = bisect.bisect_right(s,c)
if i == 0:
print(-1)
else:
print(s[i - 1])
s.pop(i - 1)
bisect.bisect_right(s,t)
會回傳” c要插入s裡的最佳index “
e.g.
s = [1,2,3,4,5]
print( bisect.bisect_right(s,6)) # output 5
所以透過套件快速二分搜來達到快速找到該值右邊index
C++
透過multiset的upper_bound 來達到同樣效果,且multiset可以依值保持有序
#include <bits/stdc++.h>
#define io ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
int i;
vector<int> ans, li;
unordered_set<int> st;
int main(){ io;
multiset<int> tik;
int n,m,p;
cin >> n>>m;
for (i=0;i<n;i++){
cin >> p;
tik.insert(p);
}
for (i=0; i<m;i++){
int cus;
cin >> cus;
auto it = tik.upper_bound(cus);
if (it == tik.begin()) cout << -1 << endl;
else{
--it;
cout << *it << "\n";
tik.erase(it);
}
}
}
