World is Mine
首先要考虑两个人的策略分别是什么,显然A每次要吃最小的蛋糕,B要么不吃,要么就把一种类的蛋糕全部吃完。所以也是动态规划dp[i][j]表示吃第i种蛋糕,B吃了j次后x的最小值
`#include<bits/stdc++.h>
using namespace std;
define int long long
define ll __int128
define endl '\n'
typedef pair<int, int> pii;
void solve() {
int n;
cin>>n;
vector<int>a(n+1),cnt(n+1);
for(int i=1;i<=n;i++){
cin>>a[i];
cnt[a[i]]++;
}
vector<vector<int>>dp(n+1,vector<int>(n+1,1e15));
dp[0][0]=0;
for(int i=1;i<=n;i++){
for(int j=0;j<=n/2;j++){
if(!cnt[i]){
dp[i][j]=dp[i-1][j];
continue;
}
if(j+cnt[i]<=n/2&&j+cnt[i]<=dp[i-1][j]){
dp[i][j+cnt[i]]=min(dp[i][j+cnt[i]],dp[i-1][j]);
}
dp[i][j]=min(dp[i][j],dp[i-1][j]+1);
}
}
int ans=1e15;
for(int i=0;i<=n/2;i++){
ans=min(ans,dp[n][i]);
}
cout<<ans<<endl;
}
signed main() {
int T = 1;
cin >> T;
while (T--) {
solve();
}
return 0;
}`