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