Educational Codeforces Round 3
Posted kisekipurin2019
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Educational Codeforces Round 3相关的知识,希望对你有一定的参考价值。
题目链接: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
", ans);
}
启示:注意只需要统计被-1的那一半就可以了,贪心选择能变成上平均值的先变完上平均值,剩下的全部都要变成下平均值(含排在后面的多出来的上平均值)。假算法用assert就知道假在哪里,相当于可以看到一点点数据。
以上是关于Educational Codeforces Round 3的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round 7 A
Educational Codeforces Round 7
Educational Codeforces Round 90
Educational Codeforces Round 33