题目传送门
题目大意
厨师刚刚把菜放进烤箱。他知道第i道菜的最佳烹饪时间是 t i t_i ti分钟。在任何正整数分钟,厨师最多只能从烤箱中拿出一个盘子。如果第i盘在某一分钟被端出,那么它令人不快的值就是 i i i和 t i t_i ti之间的绝对差值。菜一出烤箱就放不进去了。厨师应该把所有的盘子从烤箱中拿出来。求厨师能获得的最小总不愉快值是多少
思路
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]表示在第i道菜在第j分钟被拿出的最小总不愉快值
注意点,n道菜最多
2
n
2n
2n时间被全部拿出
AC Code
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<math.h>
using namespace std;
#define endl '\n'
#define INF 0x3f3f3f3f
// #define int long long
#define debug(a) cout<<#a<<"="<<a<<endl;
typedef long long ll;
const double PI=acos(-1.0);
const double e=exp(1.0);
const int M=1e9+7;
const int N=209;
inline int mymax(int x,int y){return x>y?x:y;}
inline int mymin(int x,int y){return x<y?x:y;}
int n, a[N], dp[N][N*2];
void solve(){
cin>>n;
for(int i=1; i<=n; i++) cin>>a[i];
sort(a+1, a+1+n);
memset(dp, INF, sizeof(dp));
for(int i=0; i<=n*2; i++) dp[0][i]=0;
for(int i=1; i<=n; i++)
for(int j=1; j<=n*2; j++)
dp[i][j]=min(dp[i][j-1], dp[i-1][j-1]+abs(a[i]-j));
cout<<dp[n][n*2]<<endl;
return ;
}
signed main(){
int T;
cin>>T;
while(T--) solve();
return 0;
}