Description
有 n 道菜品被放入了一个烤炉中,每到菜品都有一个最佳取出的时间 \(t_i\)。现在按照一定顺序把菜品从烤炉中取出,每到菜品都有可能因为不在最佳时间被取出而造成不美味,定义这个不美味度为 \(|T-t_i|\),其中 T 是取出的时刻。求把所有菜品都取出来的最小不美味度。\(n \le 200\)
Solution
考虑到取出所有菜品的顺序一定与他们完成的时间先后顺序相同,设 \(f[i][j]\) 表示到了时刻 \(i\) 取出了前 \(j\) 个菜品,那么很显然有转移 \(f[i][j]=\min (f[i-1][j],f[i-1][j-1]+|i-t[j]|)\),可以压掉一维倒序转移。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1005;
int n,t[N],f[N],tmax;
signed main()
{
int _;
cin>>_;
while(_--)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>t[i];
sort(t+1,t+n+1);
memset(f,0x3f,sizeof f);
f[0]=0;
for(int i=1;i<N;i++)
{
for(int j=n;j>=1;j--)
{
f[j]=min(f[j],f[j-1]+abs(i-t[j]));
}
}
cout<<f[n]<<endl;
}
}