Cod sursa(job #365112)

Utilizator popoiu.georgeGeorge Popoiu popoiu.george Data 17 noiembrie 2009 21:40:21
Problema Dezastru Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include<iostream>
#include<fstream>
#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 fact1,fact2,nrc=0,init=0;

void Citire()
{
prob[0]=1;
f>>N>>P;
for(int i=1;i<=N;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()
{
Citire();
Back();
g<< suma / (float)(nrc);
f.close();
g.close();
return 0;
}