• bzoj 1419 Red is good


    Description

    桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。

    Input

    一行输入两个数R,B,其值在0到5000之间

    Output

    在最优策略下平均能得到多少钱。

    Sample Input

    5 1

    Sample Output

    4.166666

    HINT

    输出答案时,小数点后第六位后的全部去掉,不要四舍五入.


      (题目太简洁,不需要大意)

      这道题和poj的Collecting Bugs有些类似,一样是倒推。

      用f[i][j]表示i张红牌和j张黑白时的最优答案。

      对于初值显然有 f[i][0] = 0  ,对于转移,根据题目意思转移就好了,考虑是摸到红牌还是黑牌,然后和0取max。

    Code'

     1 /**
     2  * bzoj
     3  * Problem#1419
     4  * Accepted
     5  * Time: 1388ms
     6  * Memory: 1368k
     7  */
     8 #include <bits/stdc++.h>
     9 using namespace std;
    10 #define smax(_a, _b) _a = (_a > _b) ? (_a) : (_b)
    11 
    12 const int N = 5005;
    13 
    14 int R, B;
    15 double f[2][N];
    16 
    17 inline void init() {
    18     scanf("%d%d", &R, &B);
    19 }
    20 
    21 inline void solve() {
    22     int t = 0;
    23     for(int i = 1; i <= R; i++) {
    24         t ^= 1;
    25         f[t][0] = i;
    26         for(int j = 1; j <= B; j++) {
    27             f[t][j] = (f[t ^ 1][j] + 1.0) * i + (f[t][j - 1] - 1.0) * j;
    28             f[t][j] /= i + j;
    29             if(f[t][j] < 0)
    30                 f[t][j] = 0;
    31         }
    32     }
    33     printf("%.6lf", f[t][B] - 5e-7);
    34 }
    35 
    36 int main() {
    37     init();
    38     solve();
    39     return 0;
    40 }
  • 相关阅读:
    几个有用的jQuery方法
    Highcharts常用属性的说明
    存储过程中判断临时表是否已经存在方法
    解决Dialog中EditView无法触发软键盘问题
    mysql数据库备份与恢复
    Ubuntu 安装 sunjava6jdk 错误解决办法
    putty关闭后后让java程序在后台一直执行
    jni数据类型
    android 打开各种文件(setDataAndType)
    防止Linux出现大量FIN_WAIT1
  • 原文地址:https://www.cnblogs.com/yyf0309/p/8047813.html
Copyright © 2020-2023  润新知