【技巧-二分查找】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;
}
相关文章推荐
- oracle11g dataguard主库备份恢复到测试环境单库报错:ORA-19502: write error on file
- hdu 3555 数位dp
- 黑马程序员--StringBuffer和数据缓冲池的面试题
- Sahi简单excel测试框架
- 最近一段时间总结(一)
- 类的静态成员
- LeetCode(8)--String to Integer (atoi)
- 生产环境JAVA进程高CPU占用故障排查
- Eclipse 代码提示功能设置
- SVN服务器端安装过程出现“Custom action InstallWMISchemaExecute failed:无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动。”
- div+css3中id和class的命名
- uva 10167 Birthday Cake
- Github fork和pull request概念
- poj--1149--PIGS(最大流经典建图)
- c++中类模板(class template)简单示例 http://blog.csdn.net/richerg85/article/details/7565870
- Java多线程初学笔记
- 利用python中的pandas,sklearn进行数据挖掘 basic_of_datamining
- 模糊测试工具-peachFuzzer
- Happy Number
- Hadoop分布式文件系统(HDFS)详解