题意:
n个人,每两个人要比一次赛,赢了得一分,输了不得分,给出一种比完赛之后每个人的分数,你可以给一个人加上一些分,或者减去一些分,使得分数序列合法,求最小花费(加一分或者减一分花费就是1)。
思路:
给分数序列从小到大排序,只考虑前i个人是否合法,前i个人的总分应该是tmpfen=(i-1)*i/2,如果总分大于tmpfen,那么我们不做修改,如果小于,我们就给第i个人加上差值,最后边界要处理一下,就ok了。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstdlib>
#include<cmath>
using namespace std;
int num[100];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
sort(num+1,num+1+n);
int ans=0;
int tmpsum=0;
for(int i=1;i<n;i++)
{
int tmpfen=(i-1)*i/2;
tmpsum+=num[i];
if(tmpsum<tmpfen)
{
ans+=(tmpfen-tmpsum);
tmpsum=tmpfen;
}
}
int tmpfen=(n-1)*n/2;
tmpsum+=num[n];
if(tmpsum<tmpfen)
ans+=(tmpfen-tmpsum);
else if(tmpsum>tmpfen);
ans+=(tmpsum-tmpfen);
printf("%d\n",ans);
}
return 0;
}