Problem p01420 - Generation 2

Orig Description

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 P_i percent.
When the i-th runner takes a break,  he gets rest for T_i time.
The i-th runner runs at constant speed V_i, 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
P_1 T_1 V_1
P_2 T_2 V_2
...
P_N T_N V_N
The first line of a dataset contains three integers N (1 \leq N \leq 100), M (0 \leq M \leq 50) and L (1 \leq L \leq 100,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 P_i (0 \leq P_i \leq 100), T_i (0 \leq T_i \leq 100) and V_i (0 \leq V_i \leq 100) describing the i-th runner.
P_i is the probability to take a break.
T_i is the time of resting.
V_i 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

Extracted Specification

An integer N (1 ≤ N ≤ 100), representing some quantity or size.
An integer M (0 ≤ M ≤ 50), representing some quantity or size.
An integer L (1 ≤ L ≤ 100,000), representing some quantity or size.
A list of N tuples, where each tuple contains three integers P_i (0 ≤ P_i ≤ 100), T_i (0 ≤ T_i ≤ 100), and V_i (0 ≤ V_i ≤ 100).

### Example Input:

```
2 2 50
30 50 1
30 50 2
```

### Function Signature:
Write a function f(N, M, L, runners) that takes in the input.
def f(N: int, M: int, L: int, runners: List[Tuple[int, int, int]]):
    '''
    N: an integer
    M: an integer
    L: an integer
    runners: a list of N tuples, each containing three integers
    '''

Test Case Generator

Sure, I can create a test case generator for the given problem statement "Marathon Match". Below is the Python function `tcgen` that generates random test cases for this problem:

```python
import random

def tcgen():
    # Generate N: number of runners
    N = random.randint(1, 100)
    
    # Generate M: number of resting places
    M = random.randint(0, 50)
    
    # Generate L: distance of the marathon
    L = random.randint(1, 100000)
    
    # Generate the parameters for each runner
    runners = []
    for _ in range(N):
        P_i = random.randint(0, 100)  # Probability to take a break
        T_i = random.randint(0, 100)  # Time of resting
        V_i = random.randint(0, 100)  # Speed
        runners.append((P_i, T_i, V_i))
    
    return N, M, L, runners

# Function to print the generated test case in the required format
def print_test_case():
    N, M, L, runners = tcgen()
    print(f"{N} {M} {L}")
    for runner in runners:
        print(f"{runner[0]} {runner[1]} {runner[2]}")

# Example usage
print_test_case()
```

### Explanation:
- **N**: Random integer between 1 and 100 representing the number of runners.
- **M**: Random integer between 0 and 50 representing the number of resting places.
- **L**: Random integer between 1 and 100,000 representing the distance of the marathon.
- **P_i, T_i, V_i**: For each runner, generate random integers for probability of taking a break, time of resting, and running speed, respectively. All these values are chosen within their specified limits.

The `print_test_case` function formats the generated test case into the required input format and prints it. You can call this function to generate and print a new test case each time.

Extract Arguments

def extract_arguments(fh):
    N, M, L = map(int, fh.readline().strip().split())
    runners = []
    for _ in range(N):
        P, T, V = map(int, fh.readline().strip().split())
        runners.append((P, T, V))
    return N, M, L, runners