2019杭电多校第十场 Valentine’s Day
题目
http://acm.hdu.edu.cn/showproblem.php?pid=6693
题意
小明要买礼物给女朋友,商店有n个商品,每个商品都有一个属性(0~1),属性越高让女朋友开心的概率就越高。小明只想让女朋友开心一次,请帮小明计算让小明女朋友开心一次最高的概率是多少。
题解
很好理解,概率高的商品肯定优先要买。
所以我们先按概率排序。
然后计算买1~n件商品让女朋友开心一次的概率。(只有一个商品让他开心,其他商品都要让他不开心)
因为我们已经按概率排好序了,算出来的概率只有一个峰值。
如果算出来的概率比上一次计算出的概率低的话就要跳出循环,不然会TLE。
(其实还可以加一个特判,如果有商品的概率大于0.5的话就只买一个商品就够了,但是我觉得跑循环的话也就跑一遍,问题不大)
AC代码
#include<iostream>
#include<algorithm>
using namespace std;
double a[1000005];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%lf",&a[i]);
a[i] = 1-a[i];
}
sort(a,a+n);
double maxx = 0;
int index=0;
for(int k=1;k<=n;k++)
{
double sum = 0;
for(int i=0;i<k;i++)
{
double tmp = 1;
for(int j=0;j<k;j++)
{
if(j==i)
tmp *= 1-a[j];
else
tmp *= a[j];
}
sum += tmp;
}
if(sum-maxx > 0)
maxx = sum;
else
break;
}
printf("%.12f\n",maxx);
}
return 0;
}