1. 程式人生 > 其它 >【Educational Codeforces Round 97 (Rated for Div. 2) C】Chef Monocarp

【Educational Codeforces Round 97 (Rated for Div. 2) C】Chef Monocarp

技術標籤:java演算法資料結構作業系統django

題目連結

連結

翻譯

給每道菜確定一個取出時間,每道菜對不愉快程度的貢獻為它取出的時間和最佳取出時間差的絕對值。

要求最後不愉快程度之和最小,求這個最小值。

題解

動態規劃,一個很顯然的貪心是,我們把 \(t\) 進行排序,然後依次從小到大地順序分配每個菜是最好的。

也即時間小的菜分配對應的時刻也應該要靠前。

最後用到的時刻一定不會超過 \(2*n\)。所以定義 \(f[i][j]\) 表示前 \(i\) 道菜已經分配完 \(1..j\)(不一定全用了) 這些時刻的最小

不愉快值,則有:

\(f[i][j] = min(f[i][j-1],f[i-1][j-1]+|j-t_i|)\)

程式碼

#include <bits/stdc++.h>
#define lson l,mid,rt*2
#define rson mid+1,r,rt*2+1
#define LL long long
using namespace std;

const int N = 200;

int t[N + 10],f[N + 10][2*N + 10],n;

int main(){
    // freopen("C://1.cppSourceProgram//rush.txt","r",stdin);
    ios::sync_with_stdio(0),cin.tie(0);
    int T;
    cin >> T;
    while (T--){
        cin >> n;
        for (int i = 1;i <= n; i++){
            cin >> t[i];
        }
        sort(t+1,t+1+n);
        for (int i = 1;i <= n; i++){
            for (int j = i;j <= 2*n; j++){
                f[i][j] = f[i-1][j-1]+abs(j-t[i]);
                if (j > i){
                    f[i][j] = min(f[i][j],f[i][j-1]);
                }
            }
        }
        cout << f[n][2*n] << endl;
    }
    return 0;
}