n 个同学去动物园参观,原本每人都需要买一张门票,但售票处推出了一个优惠活动,一个体重为 xx 的人可以和体重至少为 2x2x 配对,这样两人只需买一张票。现在给出了 nn 个人的体重,请你计算他们最少需要买几张门票?
输入格式
第一行一个整数 nn,表示人数。
第二行 nn 个整数,每个整数 a_ia
i
表示每个人的体重。
输出格式
一个整数,表示最少需要购买的门票数目。
题解:这个题目是俩俩匹配,最多可以匹配n/2对,所以我们把数组的 [n/2,n)存到multiset中,然后循环数组[0,n/2),从multiset中寻找第一个大于等于2*分f[i]的数。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int f[500005];
int vis[500005];
int main() {
int n;
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%d",&f[i]);
}
sort(f,f+n);
int ans=n;
multiset<int>ss;
for(int i=n/2;i<n;i++)
{
ss.insert(f[i]);
}
for(int i=0;i<n/2;i++)
{
multiset<int>::iterator it=ss.lower_bound(f[i]*2);
if(it==ss.end())
{
break;
}
ans--;
ss.erase(it);
}
cout<<ans<<endl;
return 0;
}