RocksonLee's Blog
avatar
RocksonLee
2022-03-07 13:34:16

原题链接

codeforces

luogu

题意理解

这道题是赛时做的,如果没有你谷简明扼要的翻译,的确需要一点时间(英语水平极低)

n个电池分配给k个孩子,每个孩子手中的种类就是这个孩子的贡献,输出k个数字,第k个代表有k个孩子的最小贡献

Solution

为了最小化这个总贡献,每个孩子手中种类尽可能的少,即一个种类的电池尽可能只给一个孩子拿,当孩子人数小于等于电池种类数量的时候,电池种类便是答案

当孩子人数大于电池种类,我们就将一种电池分一份给新的孩子拿,那么第k个答案就是第k-1个答案加一(观察样例法)

如何统计有多少个不同的数呢,当然是STL——set(其实像排序之类的都可以)

#include <bits/stdc++.h>
using namespace std;

#define T 300100
#define N 300100
#define il inline
#define in(a) a = read()
il int read()
{
    int x = 0, v = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-') v = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        x = (x << 3) + (x << 1) + ch - '0';
        ch = getchar();
    }
    return v * x;
}
void out(int x)
{
    if (x < 0) putchar('-'), x = -x;
    if (x > 9) out(x / 10);
    putchar(x % 10 + '0');
}
int n, m, temp;
set<int> q;
int main()
{
    in(n);
    for (int i = 0; i < n; i++)
    {
        in(m);
        q.clear();
        for (int j = 0; j < m; j++)
        {
            in(temp);
            q.insert(temp);
        }
        for (int j = 1; j <= m; j++)
        {
            if (q.size() > j)
                out(q.size());
            else
                out(j);
            printf(" ");
        }
        printf("\n");
    }
}
CF 1642B Power Walking
comment评论
Search
search