codeforces 442B B. Andrey and Problem(贪心)
题目链接:
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.
4
0.1 0.2 0.3 0.8
0.800000000000
2
0.1 0.2
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; }