Codeforces Round 901 (Div. 2) D. Jellyfish and Mex (DP)

发布时间 2023-10-07 20:38:55作者: ikunhuaji
Codeforces Round 901 (Div. 2) D. Jellyfish and Mex
//思路:对于大于mex的数不做处理,把0删完为结束
//dp[j]为mex更新到j所需要的最小花费
//用mex=i时更新到j,转移方程为 dp[j] = min(dp[j], dp[i] + i * (cnt[j] - 1) + j);

#define int long long
#define ld long double

using namespace std;

int dp[5010];
map<int, int>cnt;
int tmp;

void op()
{
	int n;
	cin >> n;
	cnt.clear();

	memset(dp, 0x3f, sizeof dp);

	for (int i = 1; i <= n; i++)
	{
		cin >> tmp;
		cnt[tmp]++;
	}

	int mex = 0;
	while (cnt[mex])mex++;

	dp[mex] = 0;

	for (int i = mex; i >= 1; i--)
	{
		for (int j = 0; j < i; j++)
		{
			dp[j] = min(dp[j], dp[i] + i * (cnt[j] - 1) + j);
		}
	}

	cout << dp[0] << endl;
}

signed main()
{

	int t;
	cin >> t;
	while (t--)op();

	return 0;

}