結果
| 問題 |
No.2094 Symmetry
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-10-09 14:49:14 |
| 言語 | Go (1.23.4) |
| 結果 |
AC
|
| 実行時間 | 103 ms / 2,000 ms |
| コード長 | 1,644 bytes |
| コンパイル時間 | 11,209 ms |
| コンパイル使用メモリ | 233,756 KB |
| 実行使用メモリ | 16,160 KB |
| 最終ジャッジ日時 | 2024-06-23 14:28:04 |
| 合計ジャッジ時間 | 16,115 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 34 |
ソースコード
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
)
var sc = bufio.NewScanner(os.Stdin)
var out = bufio.NewWriter(os.Stdout)
func main() {
buf := make([]byte, 1024*1024)
sc.Buffer(buf, bufio.MaxScanTokenSize)
sc.Split(bufio.ScanWords)
n, k := nextInt(), nextInt()
s := make([]string, 2*n)
for i := 0; i < 2*n; i++ {
s[i] = nextString()
}
c := make([][]int, 2*n)
for i := 0; i < 2*n; i++ {
c[i] = nextIntSlice(2 * n)
}
ans := solve(n, k, s, c)
PrintInt(ans)
}
func solve(n, k int, s []string, c [][]int) int {
//Ci, jが大きい順に黒くする
nb := 0
var cs []int
for i := 0; i < 2*n; i++ {
for j := 0; j < 2*n; j++ {
if s[i][j] == '#' {
nb++
}
cs = append(cs, c[i][j])
}
}
sort.Slice(cs, func(i, j int) bool {
return cs[i] > cs[j]
})
ans := 0
for i := 0; i < nb; i++ {
ans += cs[i]
}
//シンメトリーが作れないのでここで終了
if nb%2 == 1 {
return ans
}
//シンメトリーのスコアと比較する
var hcs []int
for i := 0; i < 2*n; i++ {
for j := 0; j < n; j++ {
hcs = append(hcs, c[i][j]+c[i][2*n-1-j])
}
}
ans2 := k
sort.Slice(hcs, func(i, j int) bool {
return hcs[i] > hcs[j]
})
for i := 0; i < nb/2; i++ {
ans2 += hcs[i]
}
return Max(ans, ans2)
}
func nextInt() int {
sc.Scan()
i, _ := strconv.Atoi(sc.Text())
return i
}
func nextIntSlice(n int) []int {
s := make([]int, n)
for i := range s {
s[i] = nextInt()
}
return s
}
func nextString() string {
sc.Scan()
return sc.Text()
}
func PrintInt(x int) {
defer out.Flush()
fmt.Fprintln(out, x)
}
func Max(x, y int) int {
if x < y {
return y
}
return x
}