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

题目链接:

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

Examples
input
4
0.1 0.2 0.3 0.8
output
0.800000000000
input
2
0.1 0.2
output
0.260000000000


题意:

给出n个人想出问题的概率,现在问选哪些人才能使正好想出一个问题的概率最大;

思路:

贪心,ans表示当前选一个得到的最大的概率,pre表示什么都不选的概率.然后判断当前这个如果加进来来会不会使ans变大,否则就不选;

AC代码:

#include <bits/stdc++.h>
using namespace std;

int n;
double a[110];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%lf",&a[i]);
    sort(a+1,a+n+1);
    double ans=a[n],pre=1-a[n];
    for(int i=n-1;i>0;i--)
    {
        if(ans*(1-a[i])+a[i]*pre>=ans)
        {
            ans=ans*(1-a[i])+a[i]*pre;
            pre=pre*(1-a[i]);
        }
    }
    printf("%.12f",ans);
    return 0;
}

  

原文地址:https://www.cnblogs.com/zhangchengc919/p/5940599.html