Cod sursa(job #427708)

Utilizator rusu_raduRusu Radu rusu_radu Data 28 martie 2010 12:53:05
Problema Grupuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <stdio.h>
#define Nmax 100005
#define DimMax 1000000
#define InFile "grupuri.in"
#define OutFile "grupuri.out"

int n, k;
int T[Nmax], S[Nmax];

void citire();
long long int determinare();
int verificare (int);
int binara(int);
void afisare();

int main()
{
  citire();
  afisare();
  return 0;
}

void citire()
{
  int i;
  FILE *fin=fopen (InFile, "r");
  fscanf (fin, "%d %d\n", &k, &n);
  for (i=0; i<n; i++)
  {
    fscanf (fin, "%d ", &T[i]);
    if (i==0) S[i]=T[i];
    else
      S[i]=S[i-1]+T[i];
  }
}

long long int determinare()
{
  long long int m, st=0, dr=(long long)Nmax*DimMax, p=n;
  while (st<=dr)
  {
    m=st+(dr-st)/2;
    if (verificare(m))
    {
      p=st;
      st=m+1;
    }
    else
      dr=m-1;
  }
  return p;
}

void afisare()
{
  FILE *fout=fopen (OutFile, "w");
  fprintf (fout, "%lld\n", determinare());
  fclose (fout);
}

int verificare(int x)
{
  int grp, nr, poz=binara(x);
  nr=n-poz;
  grp=nr/k;
  nr=nr%k;
  nr*=x;
  nr+=S[poz-1];
  grp+=nr/k;
  if (grp==x)
    return 1;
  else
    return 0;
}

int binara(int x)
{
  int m, st=0, dr=n-1, p=n;
  while (st<=dr)
  {
    m=st+(dr-st)/2;
    if (T[m]<=x)
    {
      p=m;
      st=m+1;
    }
    else
      dr=m-1;
  }
  return p;
}