結果
| 問題 | No.3558 Dominoes, Black and White |
| コンテスト | |
| ユーザー |
ID 21712
|
| 提出日時 | 2026-05-31 03:26:03 |
| 言語 | Go (1.26.1) |
| 結果 |
AC
|
| 実行時間 | 1,003 ms / 2,000 ms |
| コード長 | 1,916 bytes |
| 記録 | |
| コンパイル時間 | 13,794 ms |
| コンパイル使用メモリ | 280,768 KB |
| 実行使用メモリ | 29,440 KB |
| 最終ジャッジ日時 | 2026-05-31 03:26:58 |
| 合計ジャッジ時間 | 48,930 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge1_0 |
| 純コード判定待ち |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| 部分点 | 10 % | AC * 30 |
| 満点 | 90 % | AC * 89 |
| 合計 | 100 点 |
ソースコード
package main
import . "fmt"
type P struct {
row,col int
}
func abs(a int) int {
return max(-a,a)
}
func main() {
var n int
Scan(&n)
ws := make([]*P,0,n*n)
bs := make([]*P,0,n*n)
ans := 0
for row := 0; row < n; row++ {
var s string
Scan(&s)
for col, ch := range s {
if col < n {
if ch == '#' {
if len(ws) > 0 {
w := ws[0]
ws = ws[1:]
ans += abs(w.col-col)+abs(w.row-row)
} else {
bs = append(bs, &P{row,col})
}
}
} else if ch == '.' {
if len(bs) > 0 {
b := bs[0]
bs = bs[1:]
ans += abs(b.col-col)+abs(b.row-row)
} else {
ws = append(ws, &P{row,col})
}
}
}
}
Println(ans)
}
/*
考察
左半部にある黒と右半分にある白のペアのマンハッタン距離の総和が答えっぽい?
黒を移動可能オブジェとみなし、白を地面とみなしたときの、オブジェの移動量の総和として考えるみたいな?
ペアの組み方は距離最小でペアを組んでく貪欲法でよさそう?
....####
.#...###
....####
...#.###
距離貪欲だと失敗しそうな2例
....#### 下の#はどちらの.とも距離は同じだが上の.とペアを作るとアウト
#....###
....####
...###.#
.....### 上の#はどちらの.とも距離は同じだが下の.とペアを作るとアウト
..#.####
.....###
.#..####
違うっぽいなあ
横方向の移動は
左半分にある黒は真ん中を超える必要があり
右半分にある白も真ん中を超える必要があり
どちらも中央の境界まで移動させるは移動先にかかわらず必須であり
中央に寄せたあとの状態について考えてみると
最上段の黒は最上段の白とペアでつぶしたほうがよく
つまり
双方上から下へ貪欲にペアを作る
もしくは双方下から上へ貪欲にペアを作る
が最適ぽい?
*/
ID 21712