codeforces#253 D - Andrey and Problem里的数学知识
这道题是这种,给主人公一堆事件的成功概率,他仅仅想恰好成功一件。
于是,问题来了,他要选择哪些事件去做,才干使他的想法实现的概率最大。
我的第一个想法是枚举,枚举的话我想到用dfs,但是认为太麻烦。
于是想是不是有什么规律,于是推导了一下,推了一个出来,写成代码提交之后发现是错的。
最后就没办法了,剩下的时间不够写dfs,于是就放弃了。
今天看thnkndblv的代码,代码非常短,于是就想肯定是有什么数学规律,于是看了一下,
果然如此。
是这种,还是枚举,当然是有技巧的,看我娓娓道来。
枚举的话,如果总共同拥有n件事件,
从中选择1件事情去做,实现的概率最大是多少,
选择2件事情去做,实现的概率最大是多少,以此类推到选择n件事情去做。
于是就会得到n个结果,里面最大的那个就是实现主人公想法的最大概率。
这种话要从n件事件中随意选出1件事情然后比概率,随意选出2件事情然后比概率……随意选出n件事情然后比概率
还是要搜索。
可是这里就有数学知识了,能够不用搜索,做法是这种:
将n个事件成功的概率从大到小排序,
然后,
仅仅选择前1件事去做成功的概率就是“从中选择1件事情去做,最大的实现概率”
仅仅选择前2件事去做成功的概率就是“从中选择2件事情去做,最大的实现概率”
以此类推。
有了这个,这道题就非常easy了,至于为什么这样做能够,无法证明,假设有人证明的话,欢迎留言讨论,附上原题以及地址和我后来AC的代码例如以下:
http://codeforces.com/contest/443/problem/D
2 seconds
256 megabytes
standard input
standard output
Andrey needs one more problem to conduct a programming contest. He has
n friends who are always willing to help. He can ask some of them to come up with a contest problem. Andrey knows one value for each of his fiends — the probability that this friend will come up with a problem if Andrey asks him.
Help Andrey choose people to ask. As he needs only one problem, Andrey is going to be really upset if no one comes up with a problem or if he gets more than one problem from his friends. You need to choose such a set of people that maximizes the chances
of Andrey not getting upset.
The first line contains a single integer n
(1 ≤ n ≤ 100) — the number of Andrey's friends. The second line contains
n real numbers pi
(0.0 ≤ pi ≤ 1.0) — the probability that the
i-th friend can come up with a problem. The probabilities are given with at most 6 digits after decimal point.
Print a single real number — the probability that Andrey won't get upset at the optimal choice of friends. The answer will be considered valid if it differs from the correct one by at most
10 - 9.
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(double a,double b)
{
return a>b;
}
int main()
{
int n,i,j,k;
double a[110],x,sum,MAX;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%lf",&a[i]);
sort(a,a+n,cmp);
MAX=0;
for(i=1;i<=n;i++)
{
sum=0;
for(j=0;j<i;j++)
{
x=a[j];
for(k=0;k<i;k++)
{
if(j!=k)
x*=1-a[k];
}
sum+=x;
}
MAX=max(sum,MAX);
}
printf("%.12lf\n",MAX);
}
codeforces#253 D - Andrey and Problem里的数学知识的更多相关文章
- codeforces 442B B. Andrey and Problem(贪心)
题目链接: B. Andrey and Problem time limit per test 2 seconds memory limit per test 256 megabytes input ...
- 【codeforces 442B】 Andrey and Problem
http://codeforces.com/problemset/problem/442/B (题目链接) 题意 n个人,每个人有p[i]的概率出一道题.问如何选择其中s个人使得这些人正好只出1道题的 ...
- 【Codeforces 442B】Andrey and Problem
[链接] 我是链接,点我呀:) [题意] n个朋友 第i个朋友帮你的概率是pi 现在问你恰好有一个朋友帮你的概率最大是多少 前提是你可以选择只问其中的某些朋友不用全问. [题解] 主要思路是逆向思维, ...
- Codeforces Round #253 (Div. 1) B. Andrey and Problem
B. Andrey and Problem time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- Codeforces 442B Andrey and Problem(贪婪)
题目链接:Codeforces 442B Andrey and Problem 题目大意:Andrey有一个问题,想要朋友们为自己出一道题,如今他有n个朋友.每一个朋友想出题目的概率为pi,可是他能够 ...
- cf442B Andrey and Problem
B. Andrey and Problem time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- Andrey and Problem
B. Andrey and Problem time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- QDUoj GZS的三角形 棋盘里的数学 思维+杨辉三角
1. 题目 我的提交 GZS的三角形 发布时间: 2015年9月6日 15:18 最后更新: 2016年6月26日 12:10 时间限制: 1000ms 内存限制: 256M 描述 机智无 ...
- Codeforces Round #253 (Div. 2) D. Andrey and Problem
关于证明可以参考题解http://codeforces.com/blog/entry/12739 就是将概率从大到小排序然后,然后从大到小计算概率 #include <iostream> ...
随机推荐
- Delphi中运行时改变panel的位置及大小(通过wm_SysCommand来实现)
procedure TForm1.pnl1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Int ...
- 基于visual Studio2013解决面试题之0702输出数字
题目
- HDU 3068 最长回文 Manacher算法
Manacher算法是个解决Palindrome问题的O(n)算法,能够说是个超级算法了,秒杀其它一切Palindrome解决方式,包含复杂的后缀数组. 网上非常多解释,最好的解析文章当然是Leetc ...
- ABAP 常用FUNCTION集锦(转)
此文章从网上抄摘,目的用于自己记录 DYNP_VALUES_READ – 读取SCREEN字段的值,也可以用来读取报表SELECTION SCREEN. DYNP_VALUES_UPDATE – 更新 ...
- 有没有安全的工作?(99条评论)——结论是没有一劳永逸的工作,要终身学习,IT业刚出道和老手还是有区别的(同样对于新技术,薪资可能是个问题)
作者: 阮一峰 日期: 2015年12月15日 如果你经常使用互联网,可能知道有一种东西叫做Flash. 它是一种软件,用来制作网页游戏.动画,以及视频播放器.只要观看网络视频,基本都会用到它. 七八 ...
- 循环json数据的列
var len = json.length; for (var i = 0; i < len; i++) { for (obj in json[i]) { var obj2 = ...
- mysql iot 主键自增列问题
mysql 如何避免热点块? 主键按sn自增列 Oracle 可以通过翻转索引 比如 插入101 102 103 104 变成101 201 301 401 分散数据 反转索引坏处,无法index r ...
- perl 使用cookie
use Net::SMTP; use LWP::UserAgent; use HTTP::Cookies; use HTTP::Headers; use HTTP::Response; use Enc ...
- Esper学习之四:Context
上周末打球实在太累了,就没来得及更新,只是列了个提纲做做准备,发现Context还是有很多内容的.结果也花了不少时间才写完,所以这篇需要各位慢慢消化,并且最好多写几个例子加深理解. 如果有不了解Esp ...
- Swift - 告警框(UIAlertView)的用法
1,下面代码创建并弹出一个告警框,并带有“取消”“确定”两个按钮 (注:自IOS8起,建议使用UIAlertController) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 ...