轻重匹配
n 个同学去动物园参观,原本每人都需要买一张门票,但售票处推出了一个优惠活动,一个体重为 xx 的人可以和体重至少为 2x2x 配对,这样两人只需买一张票。现在给出了 nn 个人的体重,请你计算他们最少需要买几张门票?
输入格式
第一行一个整数 nn,表示人数。
第二行 nn 个整数,每个整数 a_iai 表示每个人的体重。
输出格式
一个整数,表示最少需要购买的门票数目。
数据范围
对于 30\%30% 的数据:1 \le n \le 251≤n≤25,1\le a_i \le 1001≤ai≤100。
对于 60\%60% 的数据:1 \le n \le 100001≤n≤10000,1\le a_i \le 10001≤ai≤1000。
对于 100\%100% 的数据:1 \le n \le 5\cdot 10^51≤n≤5⋅105,1\le a_i \le 10^51≤ai≤105。
样例解释
11 和 99 配对,77 和 33 配对,剩下 5,55,5 单独,一共买四张票。
样例输入
6 1 9 7 3 5 5
样例输出
4
题目来源
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
先排序,分为两部分。从每一部分的最后开始匹配
#include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> #include<map> using namespace std; int a[500005],vis[500005]; int main() { int n,k,cnt=0; scanf("%d",&n); memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } sort(a,a+n); k=n-1; for(int i=n/2-1;i>=0;i--) { if(a[k]>=2*a[i]) { vis[k]=1; k--; } cnt++;//前一部分先加一 } for(int i=k;i>n/2-1;i--) { if(!vis[i]) cnt++;//后一部分不匹配的再加一 } cout<<cnt<<endl; return 0; }
等风起的那一天,我已准备好一切