Cod sursa(job #796694)

Utilizator googolplexeGoogol googolplexe Data 12 octombrie 2012 10:16:18
Problema Dezastru Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
#include <iomanip>
#include <iostream>

using namespace std;

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

int attacks = 0, assaults = 0;
float chances[25] = {0.0f}, chanceToSurvive = 0.0f;
int permutation[25] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
float factorial = 0.0f;

int inPermutation(int value)
{
	for(int i=0 ; i < attacks; i++)
		if(permutation[i]==value)
			return 1;
	return 0;
}

void bt(int position)
{
	if(position == assaults)
	{
		for(int i=0;i<assaults;i++)
			cout<<permutation[i]<<" ";
		cout<<endl;
		float partialChance = 1.0f;
		for(int i = 0; i < assaults; i++)
			partialChance *= (2 * chances[permutation[i]]);
		chanceToSurvive += partialChance;
		factorial+=1;
	}
	else
	{
		for(int attack = position; attack < attacks; attack++)
		{
			if(!inPermutation(attack))
			{
				if(position != 0 && attack < permutation[position-1])
					continue;
				permutation[position] = attack;
				bt( position+1 );
				permutation[position] = -1;
			}
		}
	}
}

int main()
{
	in >> attacks >> assaults;
	for(int i = 0; i < attacks; i++)
		in >> chances[i];
	in.close();
	bt(0);
	factorial = 1;
	for(int i=2;i<=attacks;i++)
		factorial *= i;
	out << setprecision(6)<< chanceToSurvive/(2*factorial);
	out.close();
	return 0;
}