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

浙公网安备 33010602011771号