結果

問題 No.3496 協力カード当て
コンテスト
ユーザー ID 21712
提出日時 2026-04-17 01:23:22
言語 Go
(1.26.1)
コンパイル:
env GOCACHE=/tmp go build _filename_
実行:
./Main
結果
AC  
実行時間 54 ms / 2,000 ms
コード長 3,546 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 10,727 ms
コンパイル使用メモリ 280,996 KB
実行使用メモリ 29,948 KB
スコア 155
平均クエリ数 37.12
最終ジャッジ日時 2026-04-17 01:23:39
合計ジャッジ時間 14,834 ms
ジャッジサーバーID
(参考情報)
judge3_1 / judge1_0
純コード判定しない問題か言語
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 16
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

package main

import . "fmt"
import "math/rand"

func main() {
	var id,n,m int
	Scan(&id,&n,&m)
	mycards := make([]int, m+1)
	for i := 0; i < n; i++ {
		var c int
		Scan(&c)
		mycards[c]++
	}
	s := newS(id, n, m, mycards)
	for i := 0; i < 3*m; i++ {
		var status string
		Scan(&status)
		switch status {
			case "TURN":
				ask, guess := s.turn()
				if len(guess) == 0 {
					Println("ASK", ask)
				} else {
					Println(append([]any{"GUESS"}, guess...)...)
				}
			case "WAIT":
				s.wait()
			case "END":
				return
		}
		var answer string
		Scan(&answer)
		switch answer {
			case "COUNT":
				var x, k int
				Scan(&x, &k)
				s.count(x, k)
			case "GUESSED":
				var gid, ok int
				Scan(&gid, &ok)
				s.guessed(gid, ok)
		}
	}
}

type S struct {
	id, n, m int
	cards [][]int
	cur int
	myturn bool
}

func newS(id, n, m int, mycards []int) *S {
	s := &S{
		id: id,
		n: n,
		m: m,
		cards: [][]int{
			make([]int, m+1),
			make([]int, m+1),
			make([]int, m+1),
		},
		cur: m-1,
		myturn: false,
	}
	for _, cc := range s.cards {
		for i := range cc {
			cc[i] = -1
		}
	}
	copy(s.cards[id], mycards)
	return s
}

func (s *S)turn() (ask int, guess []any) {
	s.myturn = true
	if s.cur == 0 {
		tmp := []any{}
		for i := 1; i <= s.m; i++ {
			uc := s.cards[1][i]+s.cards[2][i]
			if uc > s.cards[0][i] {
				ask = i
				return
			}
			uc = s.cards[0][i] - uc
			for j := 0; j < uc; j++ {
				tmp = append(tmp, i)
			}
		}
		guess = tmp
		return
	}
	if s.cards[s.id][s.cur] == 0 {
		e := s.cur+1
		for e < s.m && s.cards[0][e] != -1 {
			e++
		}
		ask = e
		return
	}
	ask = s.cards[s.id][s.cur]
	return
}

func (s *S)wait() {
	s.myturn = false
}

func (s *S)count(x, k int) {
	s.cards[0][x] = k
	if s.cur == 0 {
		return
	}
	if s.myturn {
		if s.id == 2 {
			s.cur--
			for s.cur > 0 && s.cards[0][s.cur] == 0 {
				s.cards[3-s.id][s.cur] = 0
				s.cur--
			}
		}
	} else {
		if x > s.cur {
			s.cards[3-s.id][s.cur] = 0
		} else {
			s.cards[3-s.id][s.cur] = x
		}
		if s.id == 1 {
			s.cur--
			for s.cur > 0 && s.cards[0][s.cur] == 0 {
				s.cards[3-s.id][s.cur] = 0
				s.cur--
			}
		}
	}
	if s.cur == 0 {
		s.cards[3-s.id][s.m] = s.n
		for i := 1; i < s.m; i++ {
			s.cards[3-s.id][s.m] -= max(0, s.cards[3-s.id][i])
		}
	}
}

func (s *S)guessed(id, ok int) {
	
}

func init() {
	check()
}

func check() {
	m := rand.Intn(11-4+1)+4
	n := max(2, min(18, (m*(m+1)/2)/3))
	n = rand.Intn(n-2+1)+2
	println(Sprintf("n=%d,m=%d",n,m))
	all := []int{}
	for i := 1; i <= m; i++ {
		for j := 0; j < i; j++ {
			all = append(all, i)
		}
	}
	rand.Shuffle(len(all), func(i, j int) {
		all[i],all[j] = all[j],all[i]
	})
	cards := [][]int{
		make([]int, m+1),
		make([]int, m+1),
		make([]int, m+1),
		make([]int, m+1),
	}
	for i := 0; i < 3*n; i++ {
		c := all[i]
		cards[0][c]++
		cards[i%3+1][c]++
	}
	for i := 1; i <= m; i++ {
		println(Sprint(i, cards[0][i], cards[1][i], cards[2][i], cards[3][i]))
	}
	s1 := newS(1, n, m, cards[1])
	s2 := newS(2, n, m, cards[2])
	end := 0
	for i := 0; i < 3*m; i++ {
		ask, guess := s1.turn()
		s2.wait()
		if len(guess) == 0 {
			println("ask ", ask)
			s1.count(ask, cards[0][ask])
			s2.count(ask, cards[0][ask])
		} else {
			println("guess ", Sprint(guess...))
			ps := make([]int, m+1)
			for _, g := range guess {
				ps[g.(int)]++
			}
			ok := 1
			for i, p := range ps {
				if cards[3][i] != p {
					ok = 0
					break
				}
			}
			s1.guessed(s1.id, ok)
			s2.guessed(s2.id, ok)
			end |= s1.id * ok
			if end == (1|2) {
				println(Sprintf("end %d", i+1))
				return
			}
		}
		s1,s2 = s2,s1
	}
}
0