Cod sursa(job #2504705)

Utilizator alexnigaNiga Alexandru alexniga Data 5 decembrie 2019 13:33:23
Problema Dezastru Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <iomanip>

using namespace std;

ifstream f("dezastru.in");
ofstream g("dezastru.out");

int n, k;

vector <double> prob(26);
vector <int> viz(26);
vector <int> v(26);
double answ = 0;

void backCombinari(int nr, int k, vector <int> &viz, vector <int> &v, double &answ)
{
    if (nr == k + 1)
    {
        double rez = 1;
        for (int i = 1; i <= k; i++)
                rez *= prob[v[i]];
        answ += rez;
        return;
    }

    for (int i = 1; i <= n; i++)
    {
        if (viz[i] == 0)
        {
            if (v[nr - 1] < i && nr > 1)
            {
                viz[i] = 1;
                v[nr] = i;
                backCombinari(nr + 1, k, viz, v, answ);
                viz[i] = 0;
            }
            if (nr == 1)
            {
                viz[i] = 1;
                v[nr] = i;
                backCombinari(nr + 1, k, viz, v, answ);
                viz[i] = 0;
            }
        }
    }



}

int main()
{
    f >> n >> k;

    for (int i = 1; i <= n; i++)
        f >> prob[i];

    backCombinari(1, k, viz, v, answ);

    for (int i = 1; i <= n; i++)
    {
        if (i >= k + 1)
            answ = answ / i;
        if (i <= n - k)
            answ *= i;
    }

    cout << setprecision(6) << answ;
    return 0;
}