結果
| 問題 |
No.58 イカサマなサイコロ
|
| コンテスト | |
| ユーザー |
data9824
|
| 提出日時 | 2015-06-07 23:37:16 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 5,000 ms |
| コード長 | 1,395 bytes |
| コンパイル時間 | 463 ms |
| コンパイル使用メモリ | 65,612 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-06 14:40:07 |
| 合計ジャッジ時間 | 899 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 10 |
ソースコード
#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;
double pNormalSum[11][61] = { 0.0 }; // [# of dices][sum]
double pFakeSum[11][61] = { 0.0 }; // [# of dices][sum]
double pTaroSum[61];
double pJiroSum[61];
const double pNormalDice[7] = { 0, 1. / 6., 1. / 6., 1. / 6., 1. / 6., 1. / 6., 1. / 6. };
const double pFakeDice[7] = { 0, 0, 0, 0, 1. / 3., 1. / 3., 1. / 3. };
void solveSum(double pSum[11][61], const double pDice[7], int n) {
pSum[0][0] = 1.0;
for (int x = 1; x <= 6; ++x) {
pSum[1][x] = pDice[x];
}
for (int i = 1; i <= n; ++i) {
for (int x = 1; x <= 6 * n; ++x) {
pSum[i][x] = 0.0;
for (int k = 6; k >= 1; --k) {
pSum[i][x] += pSum[i - 1][x - k] * pDice[k];
}
}
}
}
int main() {
int n, k;
cin >> n >> k;
solveSum(pNormalSum, pNormalDice, n);
solveSum(pFakeSum, pFakeDice, k);
for (int sum = 1; sum <= 6 * n; ++sum) {
pTaroSum[sum] = 0.0;
for (int fakeSum = 0; fakeSum <= min(6 * k, sum); ++fakeSum) {
int normalSum = sum - fakeSum;
pTaroSum[sum] += pNormalSum[n - k][normalSum] * pFakeSum[k][fakeSum];
}
pJiroSum[sum] = pNormalSum[n][sum];
}
double pTaroWin = 0.0;
for (int taroSum = 1; taroSum <= 6 * n; ++taroSum) {
for (int jiroSum = 1; jiroSum < taroSum; ++jiroSum) {
pTaroWin += pTaroSum[taroSum] * pJiroSum[jiroSum];
}
}
cout << fixed << setprecision(6) << pTaroWin << endl;
return 0;
}
data9824