轻重搭配(贪心)

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值