2019 Hangzhou Electric Power Multi-school 10th Valentine's Day (pregunta de probabilidad)

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;
}
Publicado 51 artículos originales · alabanza ganado 16 · vistas 3366

Supongo que te gusta

Origin blog.csdn.net/weixin_43911945/article/details/100010845
Recomendado
Clasificación