cf442 B.Andrey and Problem

看题偷瞄到题解2333(以为是劲题呢。。结果是乱贪心,奇怪)

排序之后,如果加入下一个比现在更优就更新答案(奇怪啊)

t=ans*(1-a[i])+s*a[i];(ans*(1-a[i])是新的一位不选的概率(即到这位之前已经选好)+选这位(即s*a[i])(s是以前都不选的概率))

 1 #include<bits/stdc++.h>
 2 #define LL long long
 3 #define LD long double
 4 #define  N 100005
 5 using namespace std;
 6 inline int ra()
 7 {
 8     int x=0,f=1; char ch=getchar();
 9     while (ch<‘0‘ || ch>‘9‘) {if (ch==‘-‘) f=-1; ch=getchar();}
10     while (ch>=‘0‘ && ch<=‘9‘) {x=x*10+ch-‘0‘; ch=getchar();}
11     return x*f;
12 }
13 double ans,s,a[N];
14 int main()
15 {
16     int n=ra();
17     for (int i=1; i<=n; i++)
18         scanf("%lf",&a[i]);
19     sort(a+1,a+n+1);
20     s=1-a[n]; ans=a[n];
21     for (int i=n-1; i>=1; i--)
22     {
23         double t=ans*(1-a[i])+s*a[i];
24         if (t>ans) ans=t;
25         else break;
26         s*=(1-a[i]);
27     }
28     printf("%.12lf",ans);
29     return 0;
30 }
时间: 2024-08-26 09:53:23

cf442 B.Andrey and Problem的相关文章

Codeforces 442B Andrey and Problem(贪心)

题目链接:Codeforces 442B Andrey and Problem 题目大意:Andrey有一个问题,想要朋友们为自己出一道题,现在他有n个朋友,每个朋友想出题目的概率为pi,但是他可以同时向多个人寻求帮助,不过他只能要一道题,也就是如果他向两个人寻求帮助,如果两个人都成功出题,也是不可以的. 解题思路:贪心,从概率最大的人开始考虑,如果询问他使得概率变大,则要询问. #include <cstdio> #include <cstring> #include <a

codeforces#253 D - Andrey and Problem里的数学知识

这道题是这样的,给主人公一堆事件的成功概率,他只想恰好成功一件. 于是,问题来了,他要选择哪些事件去做,才能使他的想法实现的概率最大. 我的第一个想法是枚举,枚举的话我想到用dfs,可是觉得太麻烦. 于是想是不是有什么规律,于是推导了一下,推了一个出来,写成代码提交之后发现是错的. 最后就没办法了,剩下的时间不够写dfs,于是就放弃了. 今天看thnkndblv的代码,代码很短,于是就想肯定是有什么数学规律,于是看了一下, 果然如此. 是这样的,还是枚举,当然是有技巧的,看我娓娓道来. 枚举的话

[CF442B] Andrey and Problem (概率dp)

题目链接:http://codeforces.com/problemset/problem/442/B 题目大意:有n个人,第i个人出一道题的概率是pi,现在选出一个子集,使得这些人恰好出一个题的概率最大.问最大概率. 可以仿照背包问题来做,即每个人可问可不问. f[i][j]代表从前i个人里问j个人所获得1个题的最大概率. f[i][j] = max{ f[i-1][j], f[i-1][j-1]*(1-p[i])+z[i-1][j-1]*p[i] }; z[i][j]为从前i个人里问j个人所

【Codeforces 442B】Andrey and Problem

[链接] 我是链接,点我呀:) [题意] n个朋友 第i个朋友帮你的概率是pi 现在问你恰好有一个朋友帮你的概率最大是多少 前提是你可以选择只问其中的某些朋友不用全问. [题解] 主要思路是逆向思维,转换成一个一个地加上去 然后看看概率的改变值在何时为正数,显然只有为正数的时候才能加 然后概率大的和概率小的,哪一个加上去会比较优一点,也比较一下. 但是因为加上去之后S也会变化,所以只知道概率大的加上去比较优还不够. 可以再看看下面那个反证法. 它指出为何一定是选择末尾最大的若干个(也即优先选择p

暑假集训-个人赛第三场

ID Origin Title 10 / 29 Problem A CodeForces 443B Kolya and Tandem Repeat   1 / 1 Problem B CodeForces 442A Borya and Hanabi 9 / 29 Problem C CodeForces 442B Andrey and Problem 3 / 17 Problem D CodeForces 442C Artem and Array 14 / 18 Problem E CodeFo

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

Codeforces Round 253 (Div. 2)

layout: post title: Codeforces Round 253 (Div. 2) author: "luowentaoaa" catalog: true tags: mathjax: true - codeforces - 模拟栈 - 贪心 传送门 A.Anton and Letters (签到) 题意 判断字符串里面有多少个不同字符 思路 直接set一下 #include<bits/stdc++.h> using namespace std; typed

7月好题记录

Codeforces 1063 B. Labyrinth [确定性]给出一个迷宫\((1 \leq n,m \leq 2000)\),求从起点到各个点,能够做到在左移动次数不超过\(x\)次,右移动次数不超过\(y\)次的情况下到达的点的个数. 显然贪心地要求到达每个点时左右移动次数越少越好,但是两个关键字很难维护.而事实上,起点终点确定时,左移动次数确定时右移动次数一定确定.当终点在起点左侧时,最小化左移动次数即可:当终点在起点右侧时,依然最小化左移动次数即可.当然两者都最小化右移动次数也可以

A Math Problem

A Math Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 237    Accepted Submission(s): 117 Problem Description You are given a positive integer n, please count how many positive integers