计蒜客蓝桥杯模拟赛:轻重搭配:贪心
问题描述
n 个同学去动物园参观,原本每人都需要买一张门票,但售票处推出了一个优惠活动,一个体重为 x 的人可以和体重至少为 2x 配对,这样两人只需买一张票。现在给出了 n 个人的体重,请你计算他们最少需要买几张门票?
输入格式
第一行一个整数 n,表示人数。
第二行 n 个整数,每个整数 ai 表示每个人的体重。
输出格式
一个整数,表示最少需要购买的门票数目。
数据范围
对于 30% 的数据:1 ≤n≤25,1≤ai≤100。
对于 60% 的数据:1 ≤n≤10000,1≤ai≤1000。
对于 100% 的数据:1 ≤n≤5⋅10^5,1≤ai≤10^5。
样例解释
1 和 9 配对,7 和 3 配对,剩下 5,5 单独,一共买四张票。
样例输入
6
1 9 7 3 5 5
样例输出
4
题目来源
2019 蓝桥杯省赛 B 组模拟赛(一)
输入后先排序,最少的情况就是全部可以配对,那只能排序后的前一半和后一半配对,所以直接从中间开始枚举就可以。
#include <bits/stdc++.h> using namespace std; int a[500010],cnt; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n; cin >> n; cnt=n; for (int i = 0; i < n; i++) { cin >> a[i]; } sort(a, a + n); int l = n/2-1,r=n-1; while(l>=0){ if(a[r]>=a[l]*2){ cnt--; r--; l--; } else l--; } cout << cnt << "\n"; return 0; }