n 个同学去动物园参观,原本每人都需要买一张门票,但售票处推出了一个优惠活动,一个体重为 xxx 的人可以和体重至少为 2x2x2x
配对,这样两人只需买一张票。现在给出了 nnn 个人的体重,请你计算他们最少需要买几张门票?
输入格式
第一行一个整数 nnn,表示人数。
第二行 nnn 个整数,每个整数 aia_iai 表示每个人的体重。
输出格式
一个整数,表示最少需要购买的门票数目。
样例解释
111 和 999 配对,777 和 333 配对,剩下 5,55,55,5 单独,一共买四张票。
Sample Input
6
1 9 7 3 5 5
Sample Output
4
思路如下:
- 将输入的数字进行排序,采用冒泡排序我们会发现超时(博主当时就用了冒泡,呜呜呜),所以此时我们应该采用快排
- 对输入的数字排序后,我们发现如若采取遍历或者从两边开始进行的组合方法会使得浪费某些大的数字,导致中等的数字无法进行组合
- 此时我们应该可以想到将排序后的数字分成两组,前一组是小店的数字,后一组为大的数字,对此进行比较组合,从两组数的最后一个开始遍历,比较
- 如果组合成功,我们就-1,组合成功几对我们就用总人数减去组合成功的为票数
代码如下:
#include<stdio.h>
int n,i,j,a[1000000];
void kuaipai(int left,int right)
{
int temp,t;
if(left>right)
{
return;
}
temp=a[left];
i=left;
j=right;
while(i!=j)
{
while(a[j]>=temp&&i<j)
{
j--;
}
while(a[i]<=temp&&i<j)
{
i++;
}
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[left]=a[i];
a[i]=temp;
kuaipai(left,i-1);
kuaipai(i+1,right);
return ;
}
int main()
{
while(scanf("%d",&n) != EOF)
{
int i,j;
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
kuaipai(1,n);
int sum=0;
int small = n / 2;
int big= n;
while(small>=1&&big>=n/2)
{
if(a[big] >= 2 * a[small])
{
sum++;
small--;
big--;
}
else
{
small--;
}
}
printf("%d",n-sum);
}
}