alice132

 

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;
}

posted on 2026-01-20 21:37  alice_ss  阅读(0)  评论(0)    收藏  举报

导航