1. 程式人生 > 其它 >cf1621 D. The Winter Hike

cf1621 D. The Winter Hike

題意:

給定 2n*2n 網格,某些格子中有雪堆,剷除位於 \((i,j)\) 的雪堆需要花費 \(a[i][j]\)

網格的左上角(\(a[1\sim n][1\sim n]\))有 \(n^2\) 個人,每次操作選擇一行,把這行中的每個人都右移一格(越界的到對面),或者都左移一格;也可以選擇一列,同時上移/下移一格。目標是把所有人移到右下角(同一時刻一格最多一人)。移動沒有代價,可以移動無數次

現在先剷雪,再移人。問最小花費

思路:

首先右下角的 n*n 格肯定要清空。

除此之外,所有人只需要經過特殊的8個格子之一!

void sol() {
    cin >> n;
    for(int i = 1; i <= 2*n; i++)
        for(int j = 1; j <= 2*n; j++)
            cin >> a[i][j];
    ll ans = min({a[1][n+1], a[1][n+n], a[n][n+1], a[n][n+n],
        a[n+1][1], a[n+1][n], a[n+n][1], a[n+n][n]});
    for(int i = n + 1; i <= n + n; i++)
        for(int j = n + 1; j <= n + n; j++)
            ans += a[i][j];
    cout << ans << endl;
}