码迷,mamicode.com
首页 > 其他好文 > 详细

Educational Codeforces Round 3

时间:2020-03-11 23:52:54      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:force   算法   需要   启示   题意   case   tps   一半   关心   

题目链接:https://codeforces.com/contest/609

A - USB Flash Drives

送分题。

B - The Best Gift

送分题。

C - Load Balancing

题意:给一个数组,每次可以选一对数字,分别进行+1-1。使用最少次数的操作,达到最小的极差。

题解:最小的极差要么是0要么是1。可以算出sum,然后算出上平均值和下平均值的值(和个数?根本不关心个数),把<下平均值的都变成下平均值,大于上平均值的都变成上平均值。

int a[100005];

void test_case() {
    int n;
    scanf("%d", &n);
    ll sum = 0;
    for(int i = 1; i <= n; ++i) {
        scanf("%d", &a[i]);
        sum += a[i];
    }
    ll LM = sum / n;
    ll RM = LM + 1;
    int cntRM = sum % n;
    ll ans = 0;
    for(int i = 1; i <= n; ++i) {
        if(cntRM > 0 && a[i] >= RM) {
            ans += a[i] - RM;
            --cntRM;
        } else if(a[i] >= LM)
            ans += a[i] - LM;
    }
    printf("%lld\n", ans);
}

启示:注意只需要统计被-1的那一半就可以了,贪心选择能变成上平均值的先变完上平均值,剩下的全部都要变成下平均值(含排在后面的多出来的上平均值)。假算法用assert就知道假在哪里,相当于可以看到一点点数据。

Educational Codeforces Round 3

标签:force   算法   需要   启示   题意   case   tps   一半   关心   

原文地址:https://www.cnblogs.com/KisekiPurin2019/p/12466332.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!