Cod sursa(job #1742615)

Utilizator crysstyanIacob Paul Cristian crysstyan Data 16 august 2016 18:46:27
Problema Dezastru Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <fstream>
#include <iomanip>
#define NMAX 30

using namespace std;

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

int i, n, v[NMAX], level = 1, m, fr[NMAX], nrtot = 0;
double cote[NMAX], ans = 0;

double compute()
{
    double p = 1;
    for (int i = 1; i <= m; ++ i)
        p *= cote[v[i]];

    return p;
}

bool check()
{
    for (int i = 1; i <= n; ++ i)
        fr[i] = 0;

    for (i = 1; i <= n; ++ i)
    {
        fr[v[i]] ++;
        if (fr[v[i]] > 1)
            return 0;
    }
    return 1;
}

void backtracking()
{
    while (level)
    {
        bool ok = 0;
        while (v[level] < n && !ok)
        {
            v[level] ++;
            ok = check;
        }

        if (!ok)
            level --;
        else
            if (ok && level == m)
            {
                nrtot ++;
                ans += compute();
            }
        else
            if (ok)
                v[++ level] = v[level - 1];
    }
}

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

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

    backtracking();
    g << setprecision(7) << fixed << ans / nrtot;
    return 0;
}