https://codeforces.com/contest/1437/problem/C
題意:将n個菜同時放進烤箱,第i個菜的最佳烹饪時間是ti,如果第i個菜在T時間被端出,那麼對它的不滿意值就是 |T−ti|,且在每一個時刻隻能端出一個菜,問不滿意值和的最小值。
注: 1 ≤ n ≤ 200 1≤n≤200 1≤n≤200
思路:
1、最佳烹饪時間值小的肯定要先取出,是以我們先将這n個物品按照最佳烹饪時間值排序
2、設dp[i][j]表示前i-1個物品都取出時,第i個物品在j時刻取出需要花費的最小總時間
3、那麼dp[i][j]=min{dp[i-1][1]、dp[i-1][2]、、、dp[i-1][j-1]}+abs(T-ti)
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map>
#include<bitset>
using namespace std;
typedef long long ull;
const int manx = 500 + 10;
const int N = 1e7;
const int INF = 2e9;
int dp[manx][manx],n,T,t,a[manx];
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
for(int j=1;j<=2*n;j++)
dp[i][j]=INF;
for(int i=1;i<=n;i++){
for(int t=1;t<=2*n;t++){
for(int k=1;k<t;k++)
dp[i][t]=min(dp[i][t],dp[i-1][k]);
if(i==1)dp[i][t]=0;
dp[i][t]+=abs(t-a[i]);
}
}
int ans=INF;
for(int i=1;i<=2*n;i++)
ans=min(ans,dp[n][i]);
printf("%d\n",ans);
}
return 0;
}