程序设计:轻重搭配

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. 将输入的数字进行排序,采用冒泡排序我们会发现超时(博主当时就用了冒泡,呜呜呜),所以此时我们应该采用快排
  2. 对输入的数字排序后,我们发现如若采取遍历或者从两边开始进行的组合方法会使得浪费某些大的数字,导致中等的数字无法进行组合
  3. 此时我们应该可以想到将排序后的数字分成两组,前一组是小店的数字,后一组为大的数字,对此进行比较组合,从两组数的最后一个开始遍历,比较
  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);
			
		
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值