Cod sursa(job #365113)

Utilizator popoiu.georgeGeorge Popoiu popoiu.george Data 17 noiembrie 2009 21:44:11
Problema Dezastru Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
/*#include<iostream>
#include<fstream>*/
#include<stdio.h>
#define inf "dezastru.in"
#define outf "dezastru.out"
#define MaxN 26
using namespace std;

//fstream f(inf,ios::in),g(outf,ios::out);

int N,P,k,st[MaxN];
float prob[MaxN],suma,produs=1;
int nrc=0,init=0;

void Citire()
{
prob[0]=1;
//f>>N>>P;
scanf("%d%d",&N,&P);
for(int i=1;i<=N;i++){scanf("%f",&prob[i]);}//f>>prob[i];
}

void Init()
{
if(k==1)st[k]=0;
else st[k]=st[k-1];
}

int Succesor()
{
if(st[k]<N-P+k)
	{
	if(!init)produs/=prob[st[k]];
	st[k]++;
	produs*=prob[st[k]];
	init=0;
	return 1;
	}
return 0;
}

int Valid()
{
return 1;
}

int Solutie()
{
return (k==P);
}

void Back()
{
int AS;
k=1;
Init();
while(k>0)
	{
	do{}while ( (AS=Succesor()) && !Valid() );
	if(AS)
		{
		if(Solutie())
			{
			nrc++;
			//produs=1;
			//for(int i=1;i<=P;i++)produs*=prob[st[i]];
			suma+=produs;
			}
		else {init=1;k++;Init();}
		}
	else {k--;produs/=prob[st[k+1]];}
	}
}

int main()
{
freopen(inf,"r",stdin);
freopen(outf,"w",stdout);
Citire();
Back();
printf("%f",suma / (float)(nrc));
//g<< suma / (float)(nrc);
//f.close();
//g.close();
return 0;
}