这题思路不太好想。
首先先排个序,赢的次数少的人放在前头。
接下去的判断方法如下:
前1个人,至少0场胜利,他可能全部败给后面的人,也可能赢了后面某几个人。
前2个人,至少要有1场胜利,他们之间必须有一人获胜,如果不够,就需要补足。如果大于1,表示他们之中有人赢了后面某几人。
前3个人,至少要有3场胜利 ………………
前4个人,至少要有6场胜利 ………………
等等…………
前n个人(即所有的人)时,至少要有n(n-1)/2场胜利,不够则补足。但如果大于n(n-1)/2,就表示胜利场数超了,此时需要将胜利场数更改回n(n-1)/2 。
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int main(){
int s[51],p[51];
int t,i,n,res;
for(cin>>t;t--;){
cin>>n;
for(i=0,res=0;i<n;i++){
cin>>s[i];
p[i]=i?p[i-1]+i:0;
}
sort(s,s+n);
for(i=0;i<n;i++){
s[i]=i?s[i-1]+s[i]:s[i];
if(p[i]>=s[i])
res+=p[i]-s[i],s[i]=p[i];
}
cout<<res+s[n-1]-p[n-1]<<endl;
}
return 0;
}