Cod sursa(job #275113)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 10 martie 2009 11:10:44
Problema Dezastru Scor 50
Compilator c Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<stdio.h>
#define infile "dezastru.in"
#define outfile "dezastru.out"
#define nmax 31
double p[nmax]; //probabilitatile atacurilor
int viz[nmax]; //viz[i]=1 daca al i-lea atac se afla in permutare
int n,k; //primele n atacuri din cele n! permutari (combinari din n luate cate k)
double probabilitate; //suma posibilitatilor
int nr; //numarul de posibilitati

void citire()
	{
	int i;
	scanf("%d %d\n",&n,&k);
	for(i=1;i<=n;i++)
		scanf("%lf",&p[i]); //citim probabilitatea atacului i
	}

//facem aranjamentele :>
void aranjamente(int x, double pr)
	{
	//x-pozitia din aranjament
	//pr-probabilitatea acestei aranjari
	int i;
	if(x>k) //am facut aranjamentul
		{
		probabilitate+=pr; //adaugam la probabilitatea totala
		nr++; //am mai gasit o combinare, ii crestem numarul
		}
	else
		for(i=1;i<=n;i++)
			if(!viz[i]) //daca nu este deja in aranjament
				{
				viz[i]=1; //marcam k l-am pus in combinare
				aranjamente(x+1,pr*p[i]);
				viz[i]=0; //il scoatem din combinare
				}
	}

int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);

citire();
aranjamente(1,1);
printf("%lf",probabilitate/nr);

fclose(stdin);
fclose(stdout);
return 0;
}