結果
問題 | No.162 8020運動 |
ユーザー | yuki2006 |
提出日時 | 2015-03-05 22:15:16 |
言語 | Go1.4 (1.4.2) |
結果 |
AC
|
実行時間 | 154 ms / 5,000 ms |
コード長 | 2,277 bytes |
コンパイル時間 | 249 ms |
コンパイル使用メモリ | 35,500 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-05-03 20:12:05 |
合計ジャッジ時間 | 2,951 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 5 ms
6,812 KB |
testcase_01 | AC | 18 ms
6,944 KB |
testcase_02 | AC | 109 ms
6,940 KB |
testcase_03 | AC | 63 ms
6,940 KB |
testcase_04 | AC | 149 ms
6,940 KB |
testcase_05 | AC | 154 ms
6,944 KB |
testcase_06 | AC | 147 ms
6,944 KB |
testcase_07 | AC | 148 ms
6,940 KB |
testcase_08 | AC | 146 ms
6,940 KB |
testcase_09 | AC | 2 ms
6,944 KB |
testcase_10 | AC | 25 ms
6,940 KB |
testcase_11 | AC | 3 ms
6,940 KB |
testcase_12 | AC | 3 ms
6,940 KB |
testcase_13 | AC | 3 ms
6,940 KB |
testcase_14 | AC | 3 ms
6,940 KB |
testcase_15 | AC | 2 ms
6,940 KB |
testcase_16 | AC | 19 ms
6,944 KB |
testcase_17 | AC | 9 ms
6,940 KB |
testcase_18 | AC | 3 ms
6,944 KB |
testcase_19 | AC | 103 ms
6,940 KB |
testcase_20 | AC | 3 ms
6,940 KB |
testcase_21 | AC | 121 ms
6,940 KB |
testcase_22 | AC | 3 ms
6,944 KB |
testcase_23 | AC | 119 ms
6,940 KB |
testcase_24 | AC | 111 ms
6,944 KB |
testcase_25 | AC | 123 ms
6,940 KB |
testcase_26 | AC | 4 ms
6,940 KB |
testcase_27 | AC | 79 ms
6,944 KB |
testcase_28 | AC | 60 ms
6,940 KB |
ソースコード
package main import ( "bufio" "os" "strconv" "fmt" "strings" ) var s = bufio.NewScanner(os.Stdin) func next() string { s.Split(bufio.ScanWords) s.Scan() return s.Text() } func nextInt() int { i, e := strconv.Atoi(next()) if e != nil { panic(e) } return i } func nextLong() int64 { i, e := strconv.ParseInt(next(), 10, 64) if e != nil { panic(e) } return i } func nextIntArray() []int { s.Split(bufio.ScanLines) s.Scan() S := s.Text() vs := strings.Split(S, " ") N := len(vs) data := make([]int, N) for i := 0; i < N; i++ { v, e := strconv.Atoi(vs[i]) if e != nil { panic(e) } data[i] = v } return data } /* あと N年で歯が連続でK本残っている場合のK本残る期待値 */ func recv(N uint, K uint, P []int) float64 { if N == 0 || K == 0 { return float64(K) } if memo[N][K] != -1 { return memo[N][K] } if K == 1 { memo[N][K] = ((100.0-float64(P[0]))/100.0)*recv(N-1, K, P) }else { memo[N][K] = 0 for mask := uint(0); mask < (1<<K); mask++ { prob := 1.0 for i := uint(0); i < K; i++ { //左端と右端の確率 bad := 0.0 if i == 0 || i == K-1 { //連続という前提なので 1 や K-2のは歯もある bad = float64(P[1])/100.0 }else { bad = float64(P[2])/100.0 } //歯が残る if (mask&(1<<i)) > 0 { prob*=1-bad }else { prob*=bad } } left := uint(0) if prob==0.0{ continue } for i := uint(0); i < K; i++ { if (mask&(1<<i)) == 0 { //歯の連続が途切れた時の確率 memo[N][K]+=prob*recv(N-1, left, P) left = 0 }else { //歯が残っている left++ } } memo[N][K]+=prob*recv(N-1, left, P) } } return memo[N][K] } func fill(arr []float64, v float64) { for i := 0; i < len(arr); i++ { arr[i] = v } } var memo [][]float64 func main() { A := nextInt() //P[0] 両方の歯がないときの虫歯になる確率 //P[1] 片方の歯がないときの虫歯になる確率 //P[0] 両方の歯があるときの虫歯になる確率 memo = make([][]float64, 80*20) P := nextIntArray() for i := 0; i < 80; i++ { memo[i] = make([]float64, 20) fill(memo[i], -1) } // fmt.Println(memo) fmt.Println(2 * recv(uint(80 - A), uint(14), P)) }