您的位置:首页 > 其它

【技巧-二分查找】ACdreamOJ Bet 1066

2015-12-03 21:59 232 查看


Bet

Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)

Submit Statistic Next
Problem


Problem Description

Josnch星球是一个赌博之风盛行的星球。
每个人一出生就有一定数额的钱,之后的所有收入只能由赌博获得(OMG,如果RP不好,输光了所有的钱。。。)
假设赌博公司的某场赌博有 N 个结果,每个结果能获得的赔率比分别是 a[1],a[2]...a

假设现在XXX有 X 块钱,问他选择怎样的策略才能使得最坏情况下回报最大?
假设 N 个结果中只有一个是有回报的,X块钱必须全部用在这次赌博上,赔率比就是 a[i],假设你在第 i 个结果中投入了 y 块钱,那么你的回报是 y
* a[i],所谓策略是你在每个结果上的投入应该是怎么分配。
比如样例 N = 2 的时候,赔率比分别是1, 2,你有1000块钱,那么买 第一个 2000/3,后一个 1000/3,这样最坏情况下你的回报是 666.67 。


Input

多组数据。
对于每组数据,一个数 N (2 ≤  N ≤  100),N 个选择,接下来一行有 N 个数,每个数的范围是 0.01
~ 100.00 。
最后一行是一个数 X (0.01 ≤  X ≤  1000.00),代表你的钱总额。


Output

每个输出一行,最坏情况下的最大收益,保留两位小数。


Sample Input

2
1 2
1000



Sample Output

666.67



Source

dream


Manager

nanae

题意:

注意 赔率 的含义就可以了~就是回报=赔率*投资金额。

解题思路:

开始一直找规律。。。。用二分过~

AC代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
#define exp 1e-8

using namespace std;

int main()
{
int n;
while(scanf("%d",&n)!=EOF){
double a[120];
for(int i=0;i<n;i++){
scanf("%lf",&a[i]);
}
double X;
scanf("%lf",&X);
double L=0,R=100*X;
double res,sum=0;
while(R-L>=exp){
double mid=(L+R)/2;
for(int i=0;i<n;i++){
sum+=mid/a[i];
}
if(sum<=X){
L=mid;
}
else{
R=mid;
}
}
printf("%.2lf\n",L);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: