对不起,我刚刚那个帖把代码贴成 B 的了。
#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for (int i = a; i <= b; i++)
#define REP(i, a, b) for (int i = a; i >= b; i--)
#define pb push_back()
#define mkpr make_pair
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int maxn = 5005;
int t;
int n;
ll a[maxn];
int main()
{
scanf("%d", &t);
while (t--)
{
map<ll, int> vis;
scanf("%d", &n);
ll premex = 0;
FOR(i, 1, n)
{
scanf("%lld", &a[i]);
vis[a[i]]++;
while (vis[premex])
premex++;
}
sort(a + 1, a + n + 1);
int firf0 = n + 1;
FOR(i, 1, n)
{
if (a[i] != 0)
{
firf0 = i;
break;
}
}
ll ans = 0;
FOR(i, 2, firf0 - 1)
{
ans += premex;
}
if (firf0 != n + 1&&firf0!=1)
{
ll res = 0;
int lxd = 0;
FOR(i, firf0, n)
{
if (i == firf0 || a[i] == a[i - 1])
{
lxd++;
continue;
}
else
{
ll oldpre = premex;
res = (ll)premex * (ll)(lxd - 1);
vis[a[i - 1]] = 0;
premex = min(premex, a[i - 1]);
res += premex;
ll oo = res + (ll)max(0, firf0 - 2) * premex;
ans = min(ans, oo);
// printf("0 num = %d oo = %lld\n",a[i-1],oo);
lxd = 1;
premex = oldpre;
}
}
// printf("premx = %lld\n",premex);
// printf("lxd = %d\n",lxd);
ll oldpre = premex;
res = (ll)premex * (ll)(lxd - 1);
vis[a[n]] = 0;
premex = min(premex, a[n]);
res += premex;
// printf("premx = %lld\n",premex);
// printf("res = %lld\n",res);
// printf("prere = %lld\n",res);
ll oo = res + (ll)max(0, firf0 - 2) * premex;
ans = min(ans, oo);
// printf("num = %d oo = %lld\n",a[n],oo);
lxd = 1;
premex = oldpre;
}
printf("%lld\n", ans);
}
return 0;
}