标签:force 算法 需要 启示 题意 case tps 一半 关心
题目链接:https://codeforces.com/contest/609
送分题。
送分题。
题意:给一个数组,每次可以选一对数字,分别进行+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