您的位置:首页 > 其它

CodeForces 443D - Andrey and Problem(贪心)

2017-01-20 22:59 531 查看
/*
题目链接:http://codeforces.com/contest/443/problem/D

题意:某人要向他的n个朋友求助,并给出了这n个人成功帮助他的概率,
当且仅当只有一个人成功帮助他时,他才不会伤心。
那么我们想知道他不伤心的最大概率是多少。其中1≤n≤100。

设身处地的想了一想,假如先忽略只有一个人能成功帮助,如果我向朋友求助的话,
肯定希望先向最有可能成功的求助,这样的成功概率最大,
那么要是再加上只有一个人能成功呢,那么按概率排序后枚举那个成功的人就好了。

这样就可以将概率从大到小排序,然后枚举1-n个人出题,看只出一个题的概率,比较得到最大值。
*/

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <cmath>
#include <stack>
#include <string>
#include <sstream>
#include <map>
#include <set>
#define pi acos(-1.0)
#define LL long long
#define ULL unsigned long long
#define inf 0x3f3f3f3f
#define INF 1e18
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
typedef pair<int, int> P;
const double eps = 1e-10;
const int maxn = 1e6 + 5;
const int N = 1e4 + 5;
const int mod = 1e8;

double p[105];

int cmp(double a, double b)
{
return a > b;
}
int main(void)
{
//	freopen("in.txt","r", stdin);
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> p[i];
sort(p+1, p+1+n, cmp);
double ans = -1, sum, r;
for (int i = 1; i <= n; i++){ // 枚举人数
sum = 0;
for (int j = 1; j <= i; j++){ // 枚举 只有第j个人是能出题的
r = p[j];
for (int k = 1; k <= i; k++)
if (j != k) r *= (1.0 - p[k]);
sum += r;
}
ans = max(ans, sum);
}
printf("%.10f\n", ans);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: