天天看點

Educational Codeforces Round 97 C. Chef Monocarp(dp)

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

           
dp cf