Marathon Match
N people run a marathon. There are M resting places on the way. For each resting place, the i-th runner takes a break with probability Pi percent. When the i-th runner takes a break, he gets rest for Ti time.
The i-th runner runs at constant speed Vi, and the distance of the marathon is L.
You are requested to compute the probability for each runner to win the first place. If a runner arrives at the goal with another person at the same time, they are not considered to win the first place.
Input
A dataset is given in the following format:
N M L
P1 T1 V1
P2 T2 V2
…
PN TN VN
The first line of a dataset contains three integers N (1¥leqN¥leq100), M (0¥leqM¥leq50) and L (1¥leqL¥leq100,000). N is the number of runners. M is the number of resting places. L is the distance of the marathon.
Each of the following N lines contains three integers Pi (0¥leqPi¥leq100), Ti (0¥leqTi¥leq100) and Vi (0¥leqVi¥leq100) describing the i-th runner. Pi is the probability to take a break. Ti is the time of resting. Vi is the speed.
Output
For each runner, you should answer the probability of winning. The i-th line in the output should be the probability that the i-th runner wins the marathon. Each number in the output should not contain an error greater than 10−5.
Sample Input 1
2 2 50 30 50 1 30 50 2
Output for the Sample Input 1
0.28770000 0.71230000
Sample Input 2
2 1 100 100 100 10 0 100 1
Output for the Sample Input 2
0.00000000 1.00000000
Sample Input 3
3 1 100 50 1 1 50 1 1 50 1 1
Output for the Sample Input 3
0.12500000 0.12500000 0.12500000
Sample Input 4
2 2 50 30 0 1 30 50 2
Output for the Sample Input 4
0.51000000 0.49000000
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define N 105
#define M 55
double C[M][M];
int n, m;
double L, P[N], T[N], V[N];
void pre_do()
{
for(int i = 0; i <= 50; i++)
for(int j = 0; j <= 50; j++)
C[i][j] = 0;
for(int i = 0; i <= 50; i++)
{
C[i][0] = 1;
for(int j = 1; j <= i; j++)
C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
}
}
double mul_pow(double a, int k)
{
double res = 1;
while(k)
{
if(k & 1) res = res * a;
a = a * a;
k >>= 1;
}
return res;
}
double solve(int i, int k1, int j)
{
if(V[j] == 0) return 1;
double res = 0;
for(int k2 = m; k2 >= 0; k2--)
{
if(L * V[j] + V[i] * V[j] * k1 * T[i] >= L * V[i] + V[i] * V[j] * k2 * T[j]) break;
res += C[m][k2] * mul_pow(P[j], k2) * mul_pow(1 - P[j], m - k2);
}
return res;
}
int main()
{
pre_do();
while(~scanf("%d%d%lf", &n, &m, &L))
{
for(int i = 1; i <= n; i++)
{
scanf("%lf%lf%lf", &P[i], &T[i], &V[i]);
P[i] /= 100;
}
double ans;
for(int i = 1; i <= n; i++)
{
ans = 0;
if(V[i] != 0)
for(int k1 = 0; k1 <= m; k1++)
{
double tmp = C[m][k1] * mul_pow(P[i], k1) * mul_pow(1 - P[i], m - k1);
for(int j = 1; j <= n; j++)
if(j != i)
{
tmp *= solve(i, k1, j);
if(tmp == 0) break;
}
ans += tmp;
}
printf("%.10f\n", ans);
}
}
return 0;
}
/*
2 2 50
30 50 1
30 50 2
2 1 100
100 100 10
0 100 1
3 1 100
50 1 1
50 1 1
50 1 1
2 2 50
30 0 1
30 50 2
*/