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;
}
posted @ 2022-05-17 20:37  Bellala  阅读(34)  评论(0)    收藏  举报