Cod sursa(job #1367740)

Utilizator muraru_georgeMuraru George Cristian 323CB muraru_george Data 2 martie 2015 03:04:01
Problema Dezastru Scor 70
Compilator c Status done
Runda Arhiva de probleme Marime 0.85 kb
#include<stdio.h>

int v[26], checked[26], n, k, l = 0;
float p[26], all_prob;

# define MIN(a, b) ((a > b)? b : a)

void back(int nr_curent, int pos)
{

	
	if (k + 1 == nr_curent) {
		int i;
		float prob = 1;
		l++;
		if (pos) {
			for (i = 1; i <= n; i++)
				if (!checked[i])
					prob *= p[i];
		}
		else {
			for (i = 1; i <= k; i++) 
				prob *= p[v[i]];
		}
		all_prob += prob;
		return;
	}


	int i;
	for (i = 1; i <= n ; i++) {
		if (!checked[i]) {
			checked[i] = 1;
			v[nr_curent] = i;
			back(nr_curent + 1, pos);
			checked[i] = 0;
		}
	}
}
	

int main(void)
{
	FILE *f_in = freopen("dezastru.in", "rt", stdin);
	FILE *f_out = freopen("dezastru.out", "wt", stdout);

	scanf("%d %d\n", &n, &k);
	int i;
	for (i = 1; i <= n; i++)
		scanf("%f", &p[i]);
	
	if (k > n / 2 + 1) {
		k = n - k;
		back(1, 1);
	} else
		back(1, 0);
	printf("%f\n", all_prob / l);
}