Cod sursa(job #68622)

Utilizator c_sebiSebastian Crisan c_sebi Data 28 iunie 2007 18:19:49
Problema Dezastru Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include <stdio.h>

double P=0;

double afis(int n, int x[], double p[], int&nr) {
	int i;
	double aux=1;
	nr++;
	for (i=1; i<=n; ++i)
		aux*=p[x[i]];
	return aux;
}

void comb (int n, int k, double p[], int &nr){
	int line, x[30], eSuccesor, eCandidat;
	line=1;
	x[0]=0; x[1]=0;
	while (line>0) {
		do {

			if (x[line] < n-k+line) {
				x[line]++;
				eSuccesor=1;
				eCandidat=1;
			} else eSuccesor=0;
		} while (eSuccesor && !eCandidat);
		if (eSuccesor)
			if (line==k) P+=afis(k, x, p, nr);
			else x[++line]=x[line-1];
		else --line;
	}
}

int main() {
	int i, n, k, nr=0;
	double p[26];
	FILE *f=fopen ("dezastru.in", "r");
	FILE *g=fopen ("dezastru.out", "w");
	fscanf (f, "%d %d\n", &n, &k);
	for (i=1; i<=n; ++i) fscanf (f, "%lf ", &p[i]);
	comb(n, k, p, nr);
	P/=nr;
	fprintf (g, "%lf\n", P);
	fclose(f);
	fclose(g);
	return 0;
}