一、题目
二、分析
假设$ 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 ", ans2); 38 39 } 40 return 0; 41 }