这道题是这种,给主人公一堆事件的成功概率,他仅仅想恰好成功一件。

于是,问题来了,他要选择哪些事件去做,才干使他的想法实现的概率最大。

我的第一个想法是枚举,枚举的话我想到用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

D. Andrey and Problem
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

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.

Input

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.

Output

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里的数学知识的更多相关文章

  1. codeforces 442B B. Andrey and Problem(贪心)

    题目链接: B. Andrey and Problem time limit per test 2 seconds memory limit per test 256 megabytes input ...

  2. 【codeforces 442B】 Andrey and Problem

    http://codeforces.com/problemset/problem/442/B (题目链接) 题意 n个人,每个人有p[i]的概率出一道题.问如何选择其中s个人使得这些人正好只出1道题的 ...

  3. 【Codeforces 442B】Andrey and Problem

    [链接] 我是链接,点我呀:) [题意] n个朋友 第i个朋友帮你的概率是pi 现在问你恰好有一个朋友帮你的概率最大是多少 前提是你可以选择只问其中的某些朋友不用全问. [题解] 主要思路是逆向思维, ...

  4. 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 ...

  5. Codeforces 442B Andrey and Problem(贪婪)

    题目链接:Codeforces 442B Andrey and Problem 题目大意:Andrey有一个问题,想要朋友们为自己出一道题,如今他有n个朋友.每一个朋友想出题目的概率为pi,可是他能够 ...

  6. cf442B Andrey and Problem

    B. Andrey and Problem time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  7. Andrey and Problem

    B. Andrey and Problem time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  8. QDUoj GZS的三角形 棋盘里的数学 思维+杨辉三角

    1. 题目 我的提交 GZS的三角形 发布时间: 2015年9月6日 15:18   最后更新: 2016年6月26日 12:10   时间限制: 1000ms   内存限制: 256M 描述 机智无 ...

  9. Codeforces Round #253 (Div. 2) D. Andrey and Problem

    关于证明可以参考题解http://codeforces.com/blog/entry/12739 就是将概率从大到小排序然后,然后从大到小计算概率 #include <iostream> ...

随机推荐

  1. MYSQL 命令行导入导出

    1.导出mysql数据库 mysqldump -h[服务器地址本机可以忽略] -u[用户] -p[密码] -P[myql数据库端口]>导出文件位置 mysqldump -h192. -uroot ...

  2. 关于python抓取google搜索结果的若干问题

    关于python抓取google搜索结果的若干问题     前一段时间一直在研究如何用python抓取搜索引擎结果,在实现的过程中遇到了很多的问题,我把我遇到的问题都记录下来,希望以后遇到同样问题的童 ...

  3. 通过判断浏览器的userAgent,用正则来判断是否是ios和Android客户端

    <script type="text/javascript">var u = navigator.userAgent, app = navigator.appVersi ...

  4. Effective C++_笔记_条款05_了解C++默认编写并调用哪些函数

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 直接上代码: 1: class Empty{}; 如果你写了这样 ...

  5. 中间件(Middleware)

    中间件(Middleware) ASP.NET Core开发,开发并使用中间件(Middleware). 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件. 每个组件选择是否传递给管道中的下 ...

  6. viewDidLoad、viewDidUnload、viewWillAppear、viewDidAppear、viewWillDisappear 和 -viewDidDisappear的区别和使用

    首先看一下官方解释: - (void)loadView; // This is where subclasses should create their custom view hierarchy i ...

  7. clear、REFRESH、free区别

    clear可以清楚一个工作区或变量.但是如果该内表是带表头的,清空内表时需要在该内表后加[].例如:clear gt_tab[]. free可以清空带表头的内表但是不会清空这个带表头内表的表头,但是也 ...

  8. 安装logstash,elasticsearch,kibana三件套(转)

    logstash,elasticsearch,kibana三件套 elk是指logstash,elasticsearch,kibana三件套,这三件套可以组成日志分析和监控工具 注意: 关于安装文档, ...

  9. SVN权限解析规则详解(转)

    首先创建一个版本库后,会生成最初的目录结构和基本的配置文件,本文主要分析“authz”文件的内容:我们先抛开alias和groups不谈,将重点放在路径的权限配置上. 一. 权限格式 svn权限的基本 ...

  10. OpenCV在矩阵上的卷积

    转载请注明出处!!!http://blog.csdn.net/zhonghuan1992 OpenCV在矩阵上的卷积 在openCV官网上说是戴面具,事实上就是又一次计算一下矩阵中的每个value,那 ...