题解
如果贪心(尽量选择\(t_i\))的话会在一些情况下WA,如:\(1,2,3,3,3,4,5\),因此是dp啦。
\(dp[i][j]\)表示前\(i\)个时刻做前\(j\)道菜的最小不美味值。
转移方程:\(dp[i][j]=min(dp[i-1][j],dp[i-1][j-1]+abs(i-t[i]))\)
\(dp[i-1][j]\)是第i时刻不选择第j道菜的情况,\(dp[i-1][j-1]+abs(i-t[i])\)是第i时刻选择第j道菜的情况。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N=210,inf=0x3f3f3f3f;
int dp[2*N][N],t[N];
int main()
{
int q,n;
scanf("%d",&q);
while(q--)
{
memset(dp,0x3f,sizeof(dp));
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&t[i]);
sort(t+1,t+n+1);
dp[0][0]=0;
for(int i=1;i<=2*n;i++)
{
dp[i][0]=0;
for(int j=1;j<=n;j++) dp[i][j]=min(dp[i-1][j],dp[i-1][j-1]+abs(i-t[j]));
}
int ans=inf;
for(int i=1;i<=2*n;i++) ans=min(ans,dp[i][n]);
printf("%d\n",ans);
}
return 0;
}