C. The Sports Festival
首先sort一下,用d[i][j]表示上场为s[i]到s[j]时的最小值。 ans=d[1][n],最后上场的肯定为最大最小值。
状态转移方程:d[i][j]=s[j]-s[i]+min(d[i+1][j],d[i][j-1]),只能从这两个状态得到。
边界:上场为一个人时,都为0,即d[i][i]=0
代码
int s[2005];
ll d[2005][2005];
int main()
{
ios::sync_with_stdio(false); cin.tie(nullptr);
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> s[i];
}
sort(s + 1, s + n + 1);
for (int i = 1; i <= n; i++) {
d[i][i] = 0;
}
for (int dis = 1; dis < n; dis++) {
for (int i = 1; i + dis <= n; i++) {
d[i][i + dis] = s[i + dis] - s[i]
+ min(d[i + 1][i + dis], d[i][i + dis - 1]);
}
}
cout << d[1][n];
}