n 个同学去动物园参观,原本每人都需要买一张门票,但售票处推出了一个优惠活动,一个体重为 xx 的人可以和体重至少为 2x2x 配对,这样两人只需买一张票。现在给出了 nn 个人的体重,请你计算他们最少需要买几张门票?
输入格式
第一行一个整数 n,表示人数。
第二行 n个整数,每个整数 ai表示每个人的体重。
输出格式
一个整数,表示最少需要购买的门票数目。
数据范围
对于 30% 的数据:1 ≤n≤25,1≤ai≤100。
对于 60% 的数据:1≤n≤10000,1≤ai≤1000。
对于 100% 的数据:1≤n≤5⋅10的五次方
,1≤ai ≤10的五次方 。
样例解释
1和 9 配对,7 和 3配对,剩下 5,5 单独,一共买四张票。
Sample 1
Inputcopy
6
1 9 7 3 5 5
Outputcopy
4
理解//
可以把n个人利用sort排序后分为前后两部分,前半部分为物品,后半部分为盒子。如果是奇数就把最中间的树分给后面一部分(因为如果把最中间的分到前面,如果前面最小的数和后半部分最小的数匹配不上那肯定要往后继续排,这样前面的数中最后的数就有可能排不上,这样就达不到最优结果)
代码
#include<bits/stdc++.h>
using namespace std;
int a[500010];
int b[500010];
int main()
{
std::ios::sync_with_stdio(false);//加快cin和cout的输入输出速度
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
int mid=n/2+1;// 加1是因为当n为奇数时把最中间的人当作盒子
int i=1,s=0;
for(int j=mid;j<=n;j++)
{
if(a[i]*2<=a[j]&&i<mid)
{
b[i]=1;//如果可以装下就把盒子和物品都标记
b[j]=1;
i++;
s++;
}
}
int k=n-s;//相当于总数减去盒子和物品组合的数目,就相当于物品盒子组合的数目加没有匹配的
printf("%d\n",k);
return 0;
}