UVALive 5986 Wizarding Duel (思维题)

题目

UVALive 5986 Wizarding Duel

题意

n个人,两两之间会有一场比赛,没有平局,赢得得1分,输的0分。
但是比分记录有误,请推算出一组正确的比分,使所有人的分数误差总和最小,输出最小值

解法

将分数从小到大排序,对于前i个人来说,至少会有 \(minscore=i\*(i-1)/2\) 场胜利,sum表示前i个人记录的分数和,若 \(sum < minscore\) ,说明需要补上 \(minscore-sum\) 分,最终结果可能 \(sum>n\*(n-1)/2\) ,这部分差值也需要改动。

代码

#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 55;
int a[N];
int main() {
    int T, n;
    scanf("%d", &T);
    while(T--) {
        scanf("%d", &n);
        for(int i = 1; i <= n; i++)
            scanf("%d", &a[i]);
        sort(a + 1, a + n + 1);
        int ans = 0, sum = 0;
        for(int i = 1; i <= n; i++) {
            sum += a[i];
            int minscore = i * (i - 1) / 2;
            if(sum < minscore) {
                ans += minscore - sum;
                sum = minscore;
            }
        }
        printf("%d\n", ans + sum - n * (n - 1) / 2);
    }
}

来源

Regionals 2011 Asia - Amritapuri

赛后总结

2015暑假训练赛个人赛(8.19)

posted @ 2015-08-25 15:40  ACM_Record  阅读(144)  评论(0编辑  收藏  举报