2019 google kickstart round A

第一题:n个人,每个人有一个对应的技能值s,现在要从n个人中选出p个人,使得他们的技能值相同。

显然,如果存在p个人的技能值是相同的,输出0就可以了。如果不存在,就要找出p个人,对他们进行训练,治他们的技能值相同。

训练一个小时,技能值增加1,只有一个教练,也就是只能同时训练一个 人。找出最佳的p个人的方案,输出最小的训练时间。

AC的代码:

#include <stdio.h>
#include <stdlib.h>
#include <algorithm>

using namespace std;
int s[100010]; // skill score
long long int t[100010];
int e[100010];

int main()
{
    int tg;
    scanf("%d", &tg);
    int n, p;

    int ca=1;
    while(tg--) {
        scanf("%d %d", &n, &p);
        s[0] = 0;
        for(int i=1; i<=n; i++) {
            scanf("%d", &s[i]);
        }
        sort(s+1, s+n+1);

        t[0] = 0;
        for(int i=1; i<=n; i++) {
            t[i] = t[i-1] + s[i];
        }

        for(int i=p; i<=n; i++) {
            e[i] = t[i] - t[i-p];
        }

        int ans = s[p]*p - e[p];
        int cur;

        for(int i=p; i<=n; i++) {
            cur = s[i]*p - e[i];
            if(cur < ans)
                ans = cur;
        }
        printf("Case #%d: %d\n", ca, ans);
        ca++;
    }
    return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/yspworld/p/10590377.html