zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    无法卸载Visual Studio 2005,提示:"H:\vs\vs_setup.msi could not be opened"
    在两个DB的table之间同步数据
    用于标记系统是否需要重启动的注册表键值
    提高性能——存储过程最佳实践 [译自MSDN]
    几个常见的位运算问题
    [存档] 非递归后根遍历二叉树
    [存档] 用真值表设计非递归二叉树遍历算法
    补码
    卸载Google Chrome导致Outlook, Word不能打开超链接
    编程题: 将一个矩阵(二维数组)顺时针旋转90度
  • 原文地址:https://www.cnblogs.com/zhangchengc919/p/5940599.html
Copyright © 2011-2022 走看看