NC229500. 赌博
描述
输入描述
一行包括两个实数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); }