cf1621 D. The Winter Hike
阿新 • • 發佈:2022-05-17
題意:
給定 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; }