結果
| 問題 | No.309 シャイな人たち (1) |
| コンテスト | |
| ユーザー |
iwashi31
|
| 提出日時 | 2015-12-02 18:59:12 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,179 bytes |
| コンパイル時間 | 788 ms |
| コンパイル使用メモリ | 80,344 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-09-14 08:00:55 |
| 合計ジャッジ時間 | 1,444 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 4 WA * 9 |
ソースコード
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <climits>
#include <vector>
#include <string>
#include <queue>
#include <deque>
#include <list>
#include <stack>
#include <set>
#include <map>
#include <algorithm>
#define int long long
using namespace std;
signed main() {
int R, C;
cin >> R >> C;
double ret = 0;
double P[12][11];
double upP[12][11];
double leftP[12][11];
double rightP[12][11];
double actP[12][11];
for (int y = 0; y < R; y++) {
for (int x = 0; x < C; x++) {
cin >> P[y][x];
P[y][x] /= 100;
upP[y][x] = 0;
leftP[y][x] = 0;
rightP[y][x] = 0;
actP[y][x] = 0;
}
}
int S[11][11];
for (int y = 0; y < R; y++) {
for (int x = 0; x < C; x++) {
cin >> S[y][x];
}
}
for (int y = 0; y < R; y++) {
for (int x = 0; x < C-1; x++) {
leftP[y][x+1] = P[y][x];
if (S[y][x] == 0) {
leftP[y][x+1] *= 1;
} else if (S[y][x] == 1) {
leftP[y][x+1] *= 1 - (1-leftP[y][x])*(1-upP[y][x]);
} else if (S[y][x] == 2) {
leftP[y][x+1] *= leftP[y][x]*upP[y][x];
} else {
leftP[y][x+1] *= 0;
}
}
for (int x = C-1; x > 0; x--) {
rightP[y][x-1] = P[y][x];
if (S[y][x] == 0) {
rightP[y][x-1] *= 1;
} else if (S[y][x] == 1) {
rightP[y][x-1] *= 1 - (1-rightP[y][x])*(1-upP[y][x]);
} else if (S[y][x] == 2) {
rightP[y][x-1] *= rightP[y][x]*upP[y][x];
} else {
rightP[y][x-1] *= 0;
}
}
for (int x = 0; x < C; x++) {
actP[y][x] = P[y][x];
if (S[y][x] == 0) {
actP[y][x] *= 1;
} else if (S[y][x] == 1) {
actP[y][x] *= 1 - (1-leftP[y][x])*(1-rightP[y][x])*(1-upP[y][x]);
} else if (S[y][x] == 2) {
actP[y][x] *= leftP[y][x] * rightP[y][x] * upP[y][x]
+ leftP[y][x] * rightP[y][x] * (1-upP[y][x])
+ leftP[y][x] * (1-rightP[y][x]) * upP[y][x]
+ (1-leftP[y][x]) * rightP[y][x] * upP[y][x];
} else if (S[y][x] == 3) {
actP[y][x] *= leftP[y][x] * rightP[y][x] * upP[y][x];
} else {
actP[y][x] *= 0;
}
ret += actP[y][x];
upP[y+1][x] = actP[y][x];
}
}
printf("%.15f\n", ret);
return 0;
}
iwashi31