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;
}