結果

問題 No.173 カードゲーム(Medium)
ユーザー tnoda_tnoda_
提出日時 2015-04-17 23:29:01
言語 Go
(1.22.1)
結果
AC  
実行時間 226 ms / 3,000 ms
コード長 1,370 bytes
コンパイル時間 10,638 ms
コンパイル使用メモリ 239,888 KB
実行使用メモリ 8,080 KB
最終ジャッジ日時 2024-10-10 03:40:05
合計ジャッジ時間 12,790 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 7 ms
6,816 KB
testcase_01 AC 28 ms
7,820 KB
testcase_02 AC 194 ms
8,076 KB
testcase_03 AC 194 ms
8,080 KB
testcase_04 AC 185 ms
8,076 KB
testcase_05 AC 166 ms
8,080 KB
testcase_06 AC 150 ms
8,080 KB
testcase_07 AC 144 ms
8,076 KB
testcase_08 AC 145 ms
8,076 KB
testcase_09 AC 226 ms
8,076 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

package main

import (
	"fmt"
	"math/rand"
	"sort"
)

func main() {
	rand.Seed(10)
	var N int
	var PA, PB float32
	fmt.Scan(&N, &PA, &PB)
	A, B := make([]int, N), make([]int, N)
	for i := 0; i < N; i++ {
		fmt.Scan(&A[i])
	}
	for i := 0; i < N; i++ {
		fmt.Scan(&B[i])
	}
	sort.Ints(A)
	sort.Ints(B)

	sim := func() bool {

		makeDeck := func() (x, y []int) {
			x, y = make([]int, N), make([]int, N)
			for i := 0; i < N; i++ {
				x[i], y[i] = i, i
			}
			return
		}

		playGame := func(deck *[]int, cards []int, p float32) (z int) {
			L := len(*deck)
			if L > 1 && rand.Float32() > p {
				i := rand.Intn(L-1) + 1
				z = cards[(*deck)[i]]
				if i == L-1 {
					*deck = (*deck)[:(L - 1)]
				} else {
					*deck = (*deck)[:i+copy((*deck)[i:], (*deck)[i+1:])]
				}
				return
			}
			z = cards[(*deck)[0]]
			*deck = (*deck)[1:]
			return
		}

		deckA, deckB := makeDeck()
		var score int
		for i := 0; i < N; i++ {
			cardA := playGame(&deckA, A, PA)
			cardB := playGame(&deckB, B, PB)
			point := cardA + cardB
			switch {
			case cardA > cardB:
				score += point
			case cardA < cardB:
				score -= point
			default:
				fmt.Println(cardA, cardB)
				panic("not distinct!: ")
			}
		}
		return score > 0
	}

	attempt := 100000
	var win int
	for i := 0; i < attempt; i++ {
		if sim() {
			win++
		}
	}
	fmt.Printf("%f\n", 1.0*float32(win)/float32(attempt))
}
0