/*Millionaire 2008APAC local onsites C
题意:最开始你有X元钱,要进行M轮赌博。
每一轮赢的概率为P,你可以选择赌与不赌,
如果赌也可以将所持的任意一部分钱作为赌注
(可以是整数,也可以是小数)。如果赢了,赌注将翻倍;
输了赌注则没了。在M轮赌博结束后,如果你持有的钱在100万元以上,
就可以把这些钱带回家。问:
当你采取最优策略时,
获得100万元以上的钱并带回家的概率是多少。
限制:P∈[0,1]
X∈[1,1000000]
M∈[1,15]
EG:输入 M=1 P=0.5 X=50000
输出 0.50000 (保留5位小数)解:分析:由于每一轮的赌注是任意的,不一定为整数,因而有无限种可能穷竭搜索是无法实现的。但细细的想一下 >>>每个过程采取最优策略  在最后一次的赌注时 你有钱数为x如果钱数x>100万,则没有必要再赌了即赢的概率为1;如果50<= x < 100万,只要参与赌博并且赌注>= 50万则有赢的概率为P;如果x< 50万,那么无论是否参与最后一轮的赌博,压的赌注是多少赢的概率必为0。图像如下:^概率|                                          值||                         ___________       1|                         .|           ______________.                 p|           .             .|           .             .|           .             .|           .             .0|0_________50万_________100万_______》金额 0最后一轮带钱回家的概率考虑最后二轮  同理有5种情况^概率                                        值1|                          _________        1|                          .|                  ________.                 p|                  .       .|            ______.       .                 (p+p*p)/2|            .     .       .|     _______.     .       .                 p*p|     .      .     .       . |     .      .     .       .      0|0___25____50万___75万___100万_______》金额  0最后两轮带钱回家的概率综上,当参与M轮赌博时所需考虑的情况总共有2^m + 1种动态规划: 枚举每种情况的期望,找到最优步骤即可*/
# include <stdio.h>
# define QQ 15//最大值
# define max(a,b)((a)>(b)?(a):(b))
# define min(a,b)((a)<(b)?(a):(b))
double DP[2][1<<QQ+1]={0};//因为下一轮的概率只和当前轮的状态有关 所以只定义两行  用DP数组滚动
int main(){int m,w,x;int i,j,k,n,Flag[2]={0,1};double p=0,UU=0;    //1<<M+1=2^M+1=32768scanf("%d %lf %d",&m,&p,&x);n=1<<m;//n保存2^M 即2^M+1个DP位置DP[0][n]=1.0;//第n个位置对应资金大于1000000的概率for(i=0;i<m;i++)//共m轮循环{for(j=0;j<=n;j++){w=min(j,n-j);UU-=UU;//将UU变为0for(k=0;k<=w;k++)UU=max(UU,p*DP[Flag[0]][j+k]+(1-p)*DP[Flag[0]][j-k]);//UU存储进行下一轮赌博的最大概率DP[Flag[1]][j]=UU;}      //Flag[0]记录的永远是当前状态Flag[0]=1-Flag[0];//Flag[0]=0时 改为1  否则为1时改为0Flag[1]=1-Flag[1];//用Flag[0]-[1]变换  降低空间复杂度}printf("%.5lf",DP[Flag[0]][(__int64)x*n/1000000]);return 0;
}

附加小程序:

/*
有两组数:A[N],B[N];
允许任意交换A B中各自的数字顺序
计算 A1*B1 +A2*B2 +A3*B3 +A4*B4 +……的最小值
限制条件:N∈[1,800]
Ai,Bi∈[-100000,100000]
解:
1:证明:当A B数组反序排列时 得到最小值
即 若A升序排列 则B降序排列  此时会得到最小值
先考虑初始情况:
N=2时
A[2]={A1,A2};A数组此时已经按照升序排列即A1<A2
B[2]={B1,B2};
比较 A1B1+A2B2 与 A1B2+A2B1 的大小关系(做差)
A1B1+A2B2 -( A1B2+A2B1)=(A1-A2)(B1-B2);
A1-A2<0  若此时B1>B2 结果取得最小值当N>2时如果B不是按降序排列即存在 i j 使得 Bi<Bj则交换Bi,Bj就取得更小的内积因此 当A B数组反序排列时 得到最小值可以快速排序 或选择排序但是 用int存结果会超界 int最大值为2147483647 因此需要用64位整int存储
下面代码中用随机数代替输入
你只需要输入N
*/
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# define TT 100000//区间
# define N 800//n的max
void paixu(int a[],int n,int b);//对A中的N个数排序 b=0升序 b=1降序
int main(){int A[N]={0},B[N]={0},n,i;__int64 sum=0;srand(time(NULL));scanf("%d",&n);for(i=0;i<n;i++){A[i]=-10000+rand()%(2*TT);B[i]=-10000+rand()%(2*TT);printf("A[%3d]=%5d,B[%3d]=%5d\n",i,A[i],i,B[i]);}paixu(A,n,0);paixu(B,n,1);for(i=0;i<n;i++)sum+=A[i]*B[i];printf("%I64d\n",sum);return 0;
}
void paixu(int a[],int n,int b)
{int i,j,k,temp;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(b?a[j]>a[k]:a[j]<a[k])   //b=0升序  b为其他降序k=j;if(k!=i){temp=a[k];a[k]=a[i];a[i]=temp;}}
}

Millionaire 2008APAC local onsites C相关推荐

  1. GCJ2008 APAC local onsites C Millionaire

    自己Blog的第一篇文章,嗯... 接触这道题,是从<挑战程序设计竞赛>这本书看来的,其实头一遍读题解,并没有懂.当然现在已经理解了,想想当初可能是因为考虑两轮的那张概率图的问题.于是决定 ...

  2. Millionaire(2008 APAC local onsites c) 概率dp

    题意:最开始你有x元钱,要进行M轮赌博.每一轮赢的概率为P,你可以选择赌与不赌,如果赌也可以将所持的任意一部分钱作为赌注(可以是整数,也可以是小数).如果赢了,赌注将翻倍:输了赌注则没了.在M轮赌博结 ...

  3. Millionaire (2008 APAC local onsites C)

    题目可以在网上找. 很多博文上来就放代码,或者大致说一下思路,让人看着很费解,不理解代码里的变量到底是什么含义. 先把书上的讲解贴上来. 接下来,说明代码中变量的含义. (1)for(int r=0; ...

  4. Millionaire(2008 APAC local onsites C)(连续 离散化)

    /* 参加赌博,赌 M 次 ,每次都有 P 的概率下注金翻倍 ,(1-P)的概率输掉下注金 每次可以下注任何数量的金币 一开始有金币 x 个,问最后能带1000 000 个以上回家的概率 // 分析: ...

  5. GCJ 2008 APAC local onsites C Millionaire

    /* 非常值得重新重做的概率题,化连续为离散,分为(2^M +1)个区间,double型的赌注,则用该区间内的int型来代替,反正效果一样(最终得到的概率是相等的)等到要输出prv[i]时,再去找在d ...

  6. DP——2008 APAC local onsites C Millionaire

    题目链接: https://codejam.withgoogle.com/codejam/contest/32005/dashboard#s=p2 题意:在一个赌博游戏中,初始有X元,总共玩M轮,每次 ...

  7. 数据科学和数学建模_数据科学与国际象棋心理建模重叠

    数据科学和数学建模 Chess and data science have a lot in common. Some seemingly surface-level parallels includ ...

  8. 【Google Code Jam】Millionaire

    题目描述 Google Code Jam 2008APAC local onsites C 最开始你有X元钱,要进行M轮赌博.每一轮赢的概率为P,你可以选择赌与不赌,如果赌也可以将所持的任意一部分钱作 ...

  9. 挑战程序设计 Millionaire

    Millionaire (2008 APAC local onsites C) 假设游戏开始时,你有X元钱,可进行M轮竞猜.每一轮可以将所持的任意 一部分钱作为赌注,赌注不光是整数,也可以是小数.一分 ...

最新文章

  1. mha mysql 招聘_MHA实现mysql的高可用
  2. Linux操作系统Ubuntu部署J2EE篇
  3. BAPI_SALESORDER_CREATEFROMDAT2 BAPI创建VA01 销售订单
  4. 安卓学习 之 广播(五)
  5. leetcode链表题
  6. 如何跟成功的男人谈恋爱?
  7. UFLDL 教程学习笔记(二)反向传导算法
  8. 小米,红米手机miui安装谷歌服务框架GMS三件套安,安装Google Play商店
  9. 小波变换matlab程序,图像小波变换原理_图像小波变换的matlab实现详解
  10. 利用动态加载实现手机淘宝的节日特效
  11. 波形发生器c语言编程,C语言_源代码-波形发生器_程序清单.doc
  12. pcie转m2装系统win10_m.2固态硬盘怎么安装win10系统
  13. 室友在宿舍玩游戏我学java_在宿舍写代码总被一个室友认为在装逼,该怎么办?...
  14. 阿里云环境(CentOS7.6)部署Zabbix5.0 Agent2
  15. C语言中对字符串的加密和解密
  16. 2017 LARS:LARGE BATCH TRAINING OF CONVOLUTIONAL NETWORKS (训练大Batch的卷积神经网络)
  17. [语义分割]SPP、空洞卷积与ASPP总结
  18. MybatisPlus 分页排序封装
  19. cdn 中移集采_中兴通讯中标中国移动融合CDN四期集采新建项目
  20. 公众号文章同步到其它平台方法

热门文章

  1. decimal 整数 mysql_MySQL数据类型DECIMAL用法
  2. C# 正则表达式大全 潇十一郎
  3. 图文讲解如何使用Gmail绑定域名开通企业邮箱(使用时代互联的域名管理后台)
  4. HiMCM数学建模(6)---曲线回归模型与回归模型评价
  5. AutoCAD .Net 在dwg文件中存储自定义数据
  6. layer层CornerRadius影响shadow的实现
  7. matlab 有理逼近,BP神经网络函数逼近
  8. OC实战: 抽象类的实现
  9. 高层次人才一站式服务平台系统解决方案,人才综合服务平台搭建
  10. 【C++OJ_静态与友元】电视机与遥控器(友元类)