Cod sursa(job #158684)

Utilizator alecmanAchim Ioan Alexandru alecman Data 13 martie 2008 19:40:12
Problema Dezastru Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include<stdio.h>

#define INPUT "dezastru.in"
#define OUTPUT "dezastru.out"
#define NMax 26

FILE *fin=fopen(INPUT, "r"),*fout=fopen(OUTPUT, "w");

int st[ NMax ], k, n, m, LMax;

long double a[ NMax ];

long double PMax, Total;

void readValues();

inline void init();

inline int succesor();

inline int valid(){return 1;}

inline int solutie();

void printSolution();

int main()
{
  int l, as, ev;

  PMax = 1;

  readValues();

  if( m < n / 2)
    LMax = m;

  else
    LMax = n - m;

  k = 1;

  while(k)
  {
    l = 1;

    do
    {
      as = succesor();
      if( as ) ev = valid();
      if( (as && ev) || !as)
	l = 0;
    } while(l);

    if(as)
    {
      if(solutie()){}

      else
      {
	++k;

	init();
      }
    }

    else
      --k;
  }

  printSolution();

  fclose(fin);
  fclose(fout);

  return 0;
}

void readValues()
{
  fscanf(fin, "%d %d", &n, &m);

  for(int i = 1; i <= n; ++i)
  {
    fscanf(fin, "%Lf", &a[ i ]);

    PMax *= (long double)a[ i ];
  }
}

inline void init()
{
  st[ k ] = st[ k - 1 ];
}

inline int succesor()
{
  if( st[ k ] < n)
  {
    ++st[ k ];

    return 1;
  }

  return 0;
}

inline int solutie()
{
  long double PNou = 1;

  if( k == LMax )
  {
    for( int i = 1; i <= k; ++i)
      PNou *= a[ st[ i ] ];

    if( k == m )
      Total += (long double)PNou;

    else
      Total += ((long double)PMax / (long double)PNou);

    return 1;
  }

  return 0;
}

void printSolution()
{
  long prod = 1;

  for( int i = 1; i <= n; ++i)
    prod *= i;

  Total *= 2;

  fprintf(fout, "%.6Lf\n", (long double)Total/(long double)prod);
}