HDU_6693 Valentine's Day 【概率问题】

一、题目

  Valentine's Day

二、分析

  假设$ s_0 $代表不开心的概率,$ s_1 $代表开心一次的概率。

  那么随便取一个物品,那么它的开心概率为$ p _i $,可以推导加入之后使女朋友不开心和开心一次的概率为$$ s_0 = s_0(1-p_i) $$ $$ s_1 = s_1 + (s_0 - s_1)p$$

  通过式子可以推导出,如果$  s_0 \le s_1 $,则开心一次的概率就不会有任何增长。

  所以,可以将概率从大到小排序,然后不断加入,判断一下就可以了。

三、AC代码

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 #define ll long long
 5 #define Min(a,b) ((a)>(b)?(b):(a))
 6 #define Max(a,b) ((a)>(b)?(a):(b))
 7 #define P pair<int, int>
 8 
 9 int main()
10 {
11     int T;
12     scanf("%d", &T);
13     while(T--) {
14         int n;
15         double p;
16         vector<double> vec;
17         scanf("%d", &n);
18         for(int i = 0; i < n; i++) {
19             scanf("%lf", &p);
20             vec.push_back(p);
21         }
22         sort(vec.begin(), vec.end(), greater<double>());
23         double ans1 = 1.0, ans2 = 0;
24         for(int i = 0; i < vec.size(); i++) {
25             if(vec[i] == 1.0) {
26                 ans2 = 1.0;
27                 break;
28             }
29             else {
30                 double res1 = ans1 * (1.0 - vec[i]);
31                 double res2 = ans2 + vec[i]*(ans1 - ans2);
32                 ans1 = res1, ans2 = res2;
33                 if(ans1 <= ans2)
34                     break;
35             }
36         }
37         printf("%.12lf\n", ans2);
38         
39     }
40     return 0;
41 }

猜你喜欢

转载自www.cnblogs.com/dybala21/p/11403111.html