結果
| 問題 | No.3496 協力カード当て |
| コンテスト | |
| ユーザー |
ID 21712
|
| 提出日時 | 2026-04-17 01:51:25 |
| 言語 | Go (1.26.1) |
| 結果 |
AC
|
| 実行時間 | 45 ms / 2,000 ms |
| コード長 | 4,080 bytes |
| 記録 | |
| コンパイル時間 | 21,766 ms |
| コンパイル使用メモリ | 278,532 KB |
| 実行使用メモリ | 30,320 KB |
| スコア | 171 |
| 平均クエリ数 | 35.12 |
| 最終ジャッジ日時 | 2026-04-17 01:51:52 |
| 合計ジャッジ時間 | 15,438 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge3_0 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 16 |
ソースコード
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)
if n < m {
s.cur = n
for i := 1; i <= m; i++ {
s.cards[3-id][i] = 0
}
}
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++ {
if s.cards[0][i] == -1 {
continue
}
uc := s.cards[1][i]+s.cards[2][i]
uc = s.cards[0][i] - uc
for j := 0; j < uc; j++ {
tmp = append(tmp, i)
}
}
if len(tmp) == s.n {
guess = tmp
return
}
for i := 1; i <= s.m; i++ {
if s.cards[0][i] == -1 {
ask = i
return
}
}
panic("BUG")
}
if s.n < s.m {
tmp := []int{}
for i := 1; i <= s.m; i++ {
for j := 0; j < s.cards[s.id][i]; j++ {
tmp = append(tmp, i)
}
}
ask = tmp[s.cur-1]
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.n < s.m {
if s.myturn {
if s.id == 2 {
s.cur--
}
} else {
s.cards[3-s.id][x]++
if s.id == 1 {
s.cur--
}
}
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(s1.id, ok)
end |= s1.id * ok
if end == (1|2) {
println(Sprintf("end %d", i+1))
return
}
}
s1,s2 = s2,s1
}
}
ID 21712