結果
問題 | No.162 8020運動 |
ユーザー |
|
提出日時 | 2015-03-05 22:15:16 |
言語 | Go1.4 (1.4.2) |
結果 |
AC
|
実行時間 | 165 ms / 5,000 ms |
コード長 | 2,277 bytes |
コンパイル時間 | 417 ms |
コンパイル使用メモリ | 35,304 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-11-25 00:10:44 |
合計ジャッジ時間 | 3,425 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 26 |
ソースコード
package mainimport ("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] = 0for mask := uint(0); mask < (1<<K); mask++ {prob := 1.0for i := uint(0); i < K; i++ {//左端と右端の確率bad := 0.0if 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 [][]float64func 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))}