zoukankan      html  css  js  c++  java
  • Codeforces Gym 100338I TV Show DFS

    题目链接:

    http://codeforces.com/gym/100338/attachments

    题意:

    一个人去参加电视有奖问答的节目,初始奖金为100元,每答对一道问题奖金翻倍,答错奖金清零。此外有一次保险机会:花费C的奖金,下一题可以答对奖金翻倍,答错奖金不清零。
    现在给你答对每道题的概率,求最优答题策略的奖金期望。

    题解:

    http://blog.csdn.net/qq_15714857/article/details/48035161

    枚举到第i题前离开 , 并且在第k题(k小于i)使用保险,注意k可以等于0,表示 不用

    代码:

    code 1:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 #define MS(a) memset(a,0,sizeof(a))
     5 #define MP make_pair
     6 #define PB push_back
     7 const int INF = 0x3f3f3f3f;
     8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
     9 inline ll read(){
    10     ll x=0,f=1;char ch=getchar();
    11     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    12     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    13     return x*f;
    14 }
    15 //////////////////////////////////////////////////////////////////////////
    16 const int maxn = 1e5+10;
    17 
    18 double p[55],dp[55][55];
    19 int n,c;
    20 double ans;
    21 
    22 // 做到第t题 在x题之前离开 在第k题用保险,得到sum元的概率是pp【 p[1]*p[2]*p[3]*...
    23 void dfs(int t,int x,int k,double sum,double pp){ 
    24     if(t == x){
    25         dp[x][k] += sum*pp;
    26         ans = max(ans,dp[x][k]);
    27         return ;
    28     }else if(sum>=c && k==t){
    29         dfs(t+1,x,k,(sum-c),pp*(1-p[t]));
    30         dfs(t+1,x,k,(sum-c)*2,pp*p[t]);
    31     }
    32     else
    33         dfs(t+1,x,k,sum*2,pp*p[t]);
    34 }
    35 
    36 int main(){
    37     freopen("tvshow.in","r",stdin);
    38     freopen("tvshow.out","w",stdout);
    39     n=read(),c=read();
    40     for(int i=1; i<=n; i++){
    41         cin >> p[i];
    42         p[i] /= 100;
    43     }
    44 
    45     for(int i=1; i<=n+1; i++)
    46         for(int k=0; k<i; k++) // k=0 可以不用保险
    47             dfs(1,i,k,100.0,1.0);
    48 
    49     printf("%.10lf
    ",ans);
    50 
    51     return 0;
    52 }
    53 // http://codeforces.com/gym/100338/attachments

    code 2:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 #define MS(a) memset(a,0,sizeof(a))
     5 #define MP make_pair
     6 #define PB push_back
     7 const int INF = 0x3f3f3f3f;
     8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
     9 inline ll read(){
    10     ll x=0,f=1;char ch=getchar();
    11     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    12     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    13     return x*f;
    14 }
    15 //////////////////////////////////////////////////////////////////////////
    16 const int maxn = 1e5+10;
    17 
    18 int n,c;
    19 double p[55];
    20 
    21 double dfs(int t,double sum,bool have){
    22     if(t >= n){
    23         return sum;
    24     }
    25     double tmp = max(sum,p[t]*dfs(t+1,sum*2,have));
    26     double money = 0;
    27     if(sum>=c && have){
    28         money += p[t] * dfs(t+1,(sum-c)*2,false);
    29         money += (1-p[t]) * dfs(t+1,(sum-c),false);
    30     }
    31     tmp = max(tmp,money);
    32     return tmp;
    33 }
    34 
    35 int main(){
    36     freopen("tvshow.in","r",stdin);
    37     freopen("tvshow.out","w",stdout);
    38     cin >> n >> c;
    39     for(int i=0; i<n; i++){
    40         cin >> p[i];
    41         p[i] /= 100;
    42     }
    43     double ans = dfs(0,100.0,true); // true表示还有保险
    44 
    45     printf("%.10lf
    ",ans);
    46 
    47     return 0;
    48 }
    49 // http://codeforces.com/gym/100338/attachments
  • 相关阅读:
    (水题)洛谷
    (水题)洛谷
    洛谷
    (水题)洛谷
    POJ
    poj 3061(二分 or 尺取法)
    poj 2456(二分)
    poj 1064(二分答案)
    POJ 2559(单调栈)
    STL
  • 原文地址:https://www.cnblogs.com/yxg123123/p/6827673.html
Copyright © 2011-2022 走看看