列表

详情


NC229500. 赌博

描述

小王牌店举办了一场活动。参与活动的玩家可以参与若干场比赛,比赛采用1v1赛制,每个玩家的对手都将是牌店老板的手下。每个玩家每场比赛必须下注1块钱,如果赢得比赛,则玩家可以被退还赌注的同时再获得一块钱,如果输掉比赛,则无法被退还赌注。每个玩家都有p%的概率赢得比赛。
牌店还推出一个规则:每位玩家有且仅有一次机会被退还当前输掉的钱的x%。如果当前玩家是赢钱的状态,则不会获得任何返还。
阿强背着阿珍去了小王牌店,身上带着他多年攒的私房钱(可以认为有无限元钱)。给定x与p,请问阿强能获得的最大期望利润是多少。

输入描述

一行包括两个实数x(0 ≤ x < 100) 和p(0 ≤ p < 50)。实数x与p的小数点后最多2位。

输出描述

输出一个实数表示最大利润。答案的绝对误差要小于1e-4

示例1

输入:

0 49.9

输出:

0.00000000000000000000

示例2

输入:

50 49.85

输出:

7.10178452989556685537

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 73ms, 内存消耗: 464K, 提交时间: 2022-10-12 16:48:02

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <set>
#include <ctime>
#include <map>
using namespace std;
typedef long long ll;
  
long double x, p;
  
long double solve(int l, int r) {
  double cur = (powl(p, -l) - 1) / (powl(p, r - l) - 1);
  return cur * r + (1 - cur) * (1 - x) * l;
}
  
int main(void) {
    // 输入
  scanf("%Lf%Lf", &x, &p);
    // 转小数
  x /= 100; p /= 100;
    // 输的概率 / 赢的概率
  p = (1 - p) / p;
    // 答案
  long double ans = 0;
  for (int l = 0, r = 0; l > -25000; --l) {
    while (solve(l, r) < solve(l, r + 1)) {
      ++r;
    }
    ans = max(ans, solve(l, r));
  }
 
  printf("%.10Lf\n", ans);
  return 0;
}

C++ 解法, 执行用时: 160ms, 内存消耗: 472K, 提交时间: 2022-02-14 14:19:48

#include<bits/stdc++.h>
using namespace std;
long double x,p,sum=0.0,ans=0.0,t=0.0;
long double expect(int a,int b){
	double cnt=0.0;
	cnt=(powl(p,-a)-1)/(powl(p,b-a)-1);
	return cnt*b+(1-cnt)*(1-x)*a;//期望的计算 
}
int main(void) {
    scanf("%Lf %Lf",&x,&p);
	x=x/100.0;
	p=p/100.0;
	p=(1.0-p)/p;
	for(int i=0,j=0;i>-50000;i--){
		while(expect(i,j)<expect(i,j+1))j++;
		ans=max(ans,expect(i,j));
	}
  printf("%.20Lf\n", ans);
}

上一题