Distinct Numbers
題敘
給定一個長度為 $n$ 的陣列,計算陣列中不同數字的數量。
$1 \leq n \leq 2\times 10^{5}$
思路
要讓資料結構內的東西不重複,所以可以用 set 維護。
Time : $O(n\log n)$
Code :
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,x;
cin>>n;
set<int>s;
for(int i=0;i<n;i++){
cin>>x;
s.insert(x);
}
cout<<s.size();
return(0);
}
Apartments
題敘
有 $n$ 位客人、 $m$ 套公寓。你的目標是合理分配這些公寓,使盡可能多的客人都能獲得一套。
每位客人都有一個理想的面積 $b$ ,只要公寓面積 $a$ 與理想面積相差 $\leq k$ ,他們就會接受。
$1 \leq n,m \leq 2\times 10^{5}$ 、 $0 \leq k \leq 10^{9}$ 、 $1 \leq a_{i} , b_{i} \leq 10^{9}$
思路
先把 $b$ 排序,用貪心的方式來做選擇,每次都選擇可接受公寓中面積最小的。
所以需要讓一個資料結構支援「新增」、「查找」、「刪除」 (剩餘公寓面積) , 這可以使用 multiset ,因為不保證沒有重複值。
Time : $O(m \log m + m\log n)$
Code :
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m,k;
cin>>n>>m>>k;
multiset<int>a;
int x;
for(int i=0;i<n;i++){ cin>>x;a.insert(x); }
vector<int>b(m);
for(int i=0;i<m;i++) cin>>b[i];
sort(b.begin() , b.end());
int cnt = 0;
for(int i:b){
auto it = a.lower_bound(i-k);
if(it==a.end() || *it > i+k) continue;
a.erase(it);
cnt++;
}
cout<<cnt;
return(0);
}