[Code Jam] Millionaire

Problem C. Millionaire

This contest is open for practice. You can try every problem as many times as you like, though we won't keep track of which problems you solve. Read the Quick-Start Guide to get started.
Small input
13 points
Judge's response for last submission: Correct.
Large input
16 points
Judge's response for last submission: Correct.

Problem

You have been invited to the popular TV show "Would you like to be a millionaire?". Of course you would!

The rules of the show are simple:
  • Before the game starts, the host spins a wheel of fortune to determine P, the probability of winning each bet.
  • You start out with some money: X dollars.
  • There are M rounds of betting. In each round, you can bet any part of your current money, including none of it or all of it. The amount is not limited to whole dollars or whole cents.

    If you win the bet, your total amount of money increases by the amount you bet. Otherwise, your amount of money decreases by the amount you bet.

  • After all the rounds of betting are done, you get to keep your winnings (this time the amount is rounded down to whole dollars) only if you have accumulated $1000000 or more. Otherwise you get nothing.

Given MP and X, determine your probability of winning at least $1000000 if you play optimally (i.e. you play so that you maximize your chances of becoming a millionaire).

Input

The first line of input gives the number of cases, N.

Each of the following N lines has the format "M P X", where:

  • M is an integer, the number of rounds of betting.
  • P is a real number, the probability of winning each round.
  • X is an integer, the starting number of dollars.

Output

For each test case, output one line containing "Case #XY", where:

  • X is the test case number, beginning at 1.
  • Y is the probability of becoming a millionaire, between 0 and 1.

Answers with a relative or absolute error of at most 10-6 will be considered correct.

Limits

1 ≤ N ≤ 100
0 ≤ P ≤ 1.0, there will be at most 6 digits after the decimal point.
1 ≤ X ≤ 1000000

Small dataset

1 ≤ M ≤ 5

Large dataset

1 ≤ M ≤ 15

Sample


Input 

Output 
2
1 0.5 500000
3 0.75 600000

Case #1: 0.500000
Case #2: 0.843750

In the first case, the only way to reach $1000000 is to bet everything in the single round.

In the second case, you can play so that you can still reach $1000000 even if you lose a bet. Here's one way to do it:

  • You have $600000 on the first round. Bet $150000.
  • If you lose the first round, you have $450000 left. Bet $100000.
  • If you lose the first round and win the second round, you have $550000 left. Bet $450000.
  • If you win the first round, you have $750000 left. Bet $250000.
  • If you win the first round and lose the second round, you have $500000 left. Bet $500000.
这个题虽然看懂了解题,打出来了代码,不过没有“啊哈!”的感觉。自己还没能完全搞懂题目的精髓,来日温习温习吧。

#include<stdio.h>

#define N 50

char mat[N][N];
int fin[N];

double dp[20][1 << 20];//原解只用了两个一维数组交替重复使用。 

int main(void){
//	freopen("in.txt", "r", stdin);
//	freopen("out.txt", "w", stdout);
	int t, tc;
	scanf("%d", &t);
	for(tc = 1; tc <= t; tc++){
		int m, x;
		int i, j, k;
		double p;
		scanf("%d%lf%d", &m, &p, &x);
		int n = 1 << m;
		for(i = 0; i < n; i++){
			dp[m][i] = 0.0;
		}
		dp[m][n] = 1.0;
		for(k = m; k > 0; k--){
			for(i = 0; i <= n; i++){
				int lim = i < n - i ? i : n - i;
				double x = dp[k][i];
				for(j = 1; j <= lim; j++){
					double neo = (1 - p) * dp[k][i - j] + p * dp[k][i + j];
					if(neo > x){
						x = neo;
					}
				}
				dp[k - 1][i] = x;
			}
		}
		int idx = (long long)x * n / 1000000.0f;
		printf("Case #%d: %lf\n", tc, dp[0][idx]);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值