結果
問題 | No.58 イカサマなサイコロ |
ユーザー |
![]() |
提出日時 | 2014-11-10 16:21:22 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 140 ms / 5,000 ms |
コード長 | 1,378 bytes |
コンパイル時間 | 2,588 ms |
コンパイル使用メモリ | 77,492 KB |
実行使用メモリ | 54,384 KB |
最終ジャッジ日時 | 2024-12-31 09:28:18 |
合計ジャッジ時間 | 4,755 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 10 |
ソースコード
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { final static double NORMAL[] = {1,2,3,4,5,6}; final static double CHEAT [] = {4,4,5,5,6,6}; public static void main(String[] args) throws IOException { BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(r.readLine()); int k = Integer.parseInt(r.readLine()); double tarou[][] = makeDpList(n, k); double jirou[][] = makeDpList(n, 0); double sum = 0d; for(int i=n; i<=6*n; i++) { for(int j=n; j<=6*n; j++) { if(i-j <= 0) break; sum += (tarou[i][n] * jirou[j][n]); } } System.out.println(String.format("%.5f", sum)); } static double[][] makeDpList(int n, int k) { int nN = n - k; double list[][] = new double[n*6+1][n+1]; if(nN > 0) { for(int i=1; i<=6; i++) list[i][1] = 1d/6; } else { for(int i=4; i<=6; i++) list[i][1] = 2d/6; } double d[]; for(int j=2; j<=n; j++) { if(j<=nN) { d = NORMAL; } else { d = CHEAT ; } int y = 6; for(int i=j; i<=j*6; i++) { for(int m=0; m<6; m++) { int rem = i-(int)d[m]; if(rem < 0) continue; list[i][j] += list[rem][j-1]; } if(list[i][j] > 0) list[i][j] /= y; } y *= 6; } return list; } }