結果
| 問題 | No.3418 【絶望】30個並列ごちゃ混ぜHit&Blowで遊ぼう! |
| コンテスト | |
| ユーザー |
ID 21712
|
| 提出日時 | 2025-12-25 12:51:57 |
| 言語 | Go (1.23.4) |
| 結果 |
AC
|
| 実行時間 | 156 ms / 5,000 ms |
| コード長 | 4,089 bytes |
| 記録 | |
| コンパイル時間 | 11,885 ms |
| コンパイル使用メモリ | 242,576 KB |
| 実行使用メモリ | 26,356 KB |
| スコア | 9,961,902 |
| 平均クエリ数 | 380.98 |
| 最終ジャッジ日時 | 2025-12-25 12:52:32 |
| 合計ジャッジ時間 | 31,325 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 100 |
ソースコード
package main
import (
. "fmt"
. "math/rand"
. "sort"
)
func main() {
perms := [][]int{}
for a := 0; a < 5; a++ {
for b := 0; b < 5; b++ {
if a == b {
continue
}
for c := 0; c < 5; c++ {
if a == c || b == c {
continue
}
for d := 0; d < 5; d++ {
if a == d || b == d || c == d {
continue
}
for e := 0; e < 5; e++ {
if a == e || b == e || c == e || d == e {
continue
}
perms = append(perms, []int{a, b, c, d, e})
}
}
}
}
}
Shuffle(len(perms), func(i, j int) {
perms[i], perms[j] = perms[j], perms[i]
})
xxs := [][]int{}
for a := 0; a <= 9; a++ {
for b := a + 1; b <= 9; b++ {
for c := b + 1; c <= 9; c++ {
for d := c + 1; d <= 9; d++ {
for e := d + 1; e <= 9; e++ {
xs := []int{a, b, c, d, e}
xxs = append(xxs, xs)
}
}
}
}
}
Shuffle(len(xxs), func(i, j int) {
xxs[i], xxs[j] = xxs[j], xxs[i]
})
for xxi, xs := range xxs {
ccc := make([]int, 60)
omits := [][]int{}
tried := map[int]bool{}
for pi, p := range perms {
ok := true
for _, omp := range omits {
for i, pp := range p {
if omp[i] == pp {
ok = false
break
}
}
}
if !ok {
continue
}
num := 0
for _, j := range p {
num = num*10 + xs[j]
}
if tried[num] {
continue
}
tried[num] = true
for _, j := range p {
Print(xs[j])
}
Println()
fin := false
cnt := 0
mm := make([]int, 60)
for i := 0; i < 30; i++ {
var hi, bi int
Scan(&hi, &bi)
if i == 0 && hi == 5 && bi == 0 {
fin = true
}
if pi == 0 {
ccc[hi+bi]++
}
mm[hi*10+bi]++
if hi != 5 && hi+bi == 5 {
cnt++
}
}
if fin {
return
}
if cnt == 0 {
break
}
if cnt == 1 && mm[5] > 0 {
omits = append(omits, p)
}
if cnt > 0 && mm[32] > 0 {
if ret := hb32(tried, xs, p, cnt); ret == 1 {
return
} else if ret == 2 {
break
}
} else if cnt > 0 && mm[14] > 0 {
tperms := perms[pi+1:]
Slice(tperms, func(i, j int) bool {
var c1, c2 int
for k, v := range tperms[i] {
if p[k] == v {
c1++
}
}
for k, v := range tperms[j] {
if p[k] == v {
c2++
}
}
if c1 != 1 {
c1 = 0
}
if c2 != 1 {
c2 = 0
}
return c1 > c2
})
} else if cnt > 0 && mm[23] > 0 {
tperms := perms[pi+1:]
Slice(tperms, func(i, j int) bool {
var c1, c2 int
for k, v := range tperms[i] {
if p[k] == v {
c1++
}
}
for k, v := range tperms[j] {
if p[k] == v {
c2++
}
}
if c1 != 2 {
c1 = 0
}
if c2 != 2 {
c2 = 0
}
return c1 > c2
})
}
}
{
// 意味なしパート
nnn := make([]int, 10)
for _, x := range xs {
nnn[x]++
}
txxs := xxs[xxi+1:]
ccc[0] *= 100
Slice(txxs, func(i, j int) bool {
var c1, c2 int
for _, x := range txxs[i] {
c1 += nnn[x]
}
for _, x := range txxs[j] {
c2 += nnn[x]
}
return ccc[c1] > ccc[c2]
})
}
}
}
func hb32(tried map[int]bool, xs, p []int, cnt0 int) (ret int) {
omit := make([]bool, 10)
for i := 0; i < 5; i++ {
if omit[i] {
continue
}
for j := i+1; j < 5; j++ {
if omit[j] {
continue
}
ys := make([]int, len(xs))
for u, v := range p {
ys[u] = xs[v]
}
ys[i], ys[j] = ys[j], ys[i]
num := 0
for _, y := range ys {
num = num*10 + y
}
if tried[num] {
continue
}
tried[num] = true
for _, y := range ys {
Print(y)
}
Println()
fin := false
cnt := 0
mm := make([]int, 60)
for k := 0; k < 30; k++ {
var hi, bi int
Scan(&hi, &bi)
if k == 0 && hi == 5 && bi == 0 {
fin = true
}
mm[hi*10+bi]++
if hi != 5 && hi+bi == 5 {
cnt++
}
}
if fin {
ret = 1
return
}
if cnt == 0 {
ret = 2
return
}
if cnt < cnt0 {
ret = -cnt
return
}
if mm[41] > 0 {
omit[j] = true
break
}
}
}
return
}
ID 21712