Cod sursa(job #251420)

Utilizator razyelxrazyelx razyelx Data 2 februarie 2009 16:07:28
Problema Dezastru Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <stdio.h>
FILE* fin  = fopen("dezastru.in","r");
FILE* fout = fopen("dezastru.out","w");

int n,m,st[30],as,ev,k;
long long nr;

float p[30],rez,x=1;

void init(){
     if(k>1)
       st[k]=st[k-1];
     else
       st[k] = 0;
}
int succ(){
    if(st[k]<n-m+k){st[k]++;return 1;}
    return 0;
}
int valid(){
    if(st[k] <= st[k-1] && k>1)return 0;

    x*=p[st[k]];

    return 1;
}
int sol(){
    return k==m;
}
void tipar(){
     nr++;
     rez+=x;

     x/=p[st[k]];
}
void back(){
     k=1;
     init();
     while(k>0){
	  as=1;ev=0;
	  while(as&&!ev){
	       as=succ();
	       if(as)ev=valid();
	  }
	  if(as)
	    if(sol())tipar();
	    else{k++;init();}

	  else{k--;if(k)x/=p[st[k]];}
     }
}
int main(){
    int i;
    fscanf(fin,"%d%d",&n,&m);
    for(i=1;i<=n;i++)
       fscanf(fin,"%f",&p[i]);

    back();

    fprintf(fout,"%0.6f",rez/nr);
    return 0;
}