2019 Hangzhou TV Multi-escuela 10th Valentine's Day
Titulo
http://acm.hdu.edu.cn/showproblem.php?pid=6693
Titulo
Xiaoming quiere comprar regalos para su novia. La tienda tiene n productos, y cada producto tiene un atributo (0 ~ 1). Cuanto mayor es el atributo, mayor es la probabilidad de hacer feliz a la novia. Xiaoming solo quiere hacer feliz a su novia una vez. Ayude a Xiaoming a calcular la mayor probabilidad de hacer feliz a la novia de Xiaoming una vez.
Solución
Es fácil entender que los productos con alta probabilidad deben comprarse primero.
Entonces, primero ordenamos por probabilidad.
Luego calcule la probabilidad de comprar 1 ~ n artículos para hacer feliz a su novia una vez. (Solo hay un producto que lo hace feliz, y otros productos tienen que hacerlo infeliz)
Debido a que hemos ordenado el orden de acuerdo con la probabilidad, la probabilidad calculada tiene solo un pico.
Si la probabilidad calculada es menor que la última probabilidad calculada, debe saltar fuera del ciclo, de lo contrario será TLE.
(De hecho, también puede agregar un juicio especial. Si la probabilidad de un producto es mayor que 0.5, es suficiente para comprar un solo producto, pero creo que si ejecuta el ciclo, lo ejecutará nuevamente, y el problema no es grande).
Código 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;
}