1 条题解

  • 1
    @ 2024-10-24 11:45:47

    解题思路

    先用一个数组计数,再排序,把数量最多的放在前面,由于序列中出现次数严格大于序列长度一半的元素被称为序列的领导元素,所以每个序列的长度最小就是 2×ai12 \times a_{i} - 1aia_{i} 指前面计数的数组的元素),再看一共能划分多少次序列,这样,划分的数目自然就最小,最后输出即可。

    code

    # include <bits/stdc++.h>
    using namespace std;
    const int N = 5e5 + 10;
    int n;
    int a[N];
    int main() {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) {
            int x;
            scanf("%d", &x);
            a[x]++;
        }
        sort(a + 1, a + n + 1, greater<int>());
        int cnt = n, ret = 0;
        for (int i = 1; i <= n && cnt > 0; i++) {
            cnt -= 2 * a[i] - 1;
            ret++;
        }
        printf("%d", ret);
        return 0;
    }
    
    • 1

    信息

    ID
    14308
    时间
    3000ms
    内存
    1024MiB
    难度
    2
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者