2026.1.10 作业 - # P12257 [蓝桥杯 2024 国 Java B] 分组
题目描述
小明班上有 \(n\) 名同学,老师准备按上一次考试的分数对同学们进行分组,第 \(i\) 名同学的分数为 \(a_i\)。老师希望把同学们分为尽可能多的小组,且满足每个小组中的同学分数的最大值至少是最小值的两倍。请问最多能分出多少个小组?如果把所有人分到同一组都不能满足条件则输出 \(0\)。
输入格式
输入共 \(2\) 行。
第一行为一个正整数 \(n\)。
第二行为 \(n\) 个由空格分开的正整数表示 \(a_1, a_2, \ldots, a_n\)。
输出格式
输出共 \(1\) 行,一个整数表示答案。
输入输出样例 #1
输入 #1
6
3 5 2 1 4 2
输出 #1
3
说明/提示
样例说明
其中一种分组方式:第一组 \(\{a_4, a_1\} = \{1, 3\}\),第二组 \(\{a_3, a_2\} = \{2, 5\}\),第三组 \(\{a_6, a_5\} = \{2, 4\}\)。
评测用例规模与约定
- 对于 \(20\%\) 的评测用例,保证 \(n \leq 10\)。
- 对于 \(100\%\) 的评测用例,保证 \(1\leq n \leq 10^5\),\(0 < a_i \leq 10^8\)。
题解
最多的分组数量是n/2组,最小数的下标是1---n/2,最大数的下标是n/2+1---n
尽量为小的数找到的满足条件的尽可能小的组员,多余的数,可以任意放。
#include <bits/stdc++.h>
using namespace std;
int n,a[100002];
int main() {
cin>>n;
for (int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
int i,j=n/2;
for (i=1;i<=n/2 && j<n;i++) {
j++;
while (j<=n && a[j]<a[i]*2)j++;
if (j>n) break;
}
cout<<i-1<<endl;
return 0;
}
浙公网安备 33010602011771号