Millionaire 2008APAC local onsites C

/*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 
# define QQ 15//最大值
# define max(a,b)((a)>(b)?(a):(b))
# define min(a,b)((a)<(b)?(a):(b))
double DP[2][1<

附加小程序:

/*
有两组数: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数组此时已经按照升序排列即A1B2 结果取得最小值

  当N>2时
  如果B不是按降序排列
  即存在 i j 使得 Bi
# include 
# include 
# 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;ia[k]:a[j]


你可能感兴趣的:(编程题,C语言小程序)