Cod sursa(job #428290)

Utilizator rusu_raduRusu Radu rusu_radu Data 29 martie 2010 09:19:25
Problema Grupuri Scor 36
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <stdio.h>
#define Nmax 100005
#define DimMax 1000000
#define InFile "grupuri.in"
#define OutFile "grupuri.out"
 
int n, k;
long long int T[Nmax];
long long S[Nmax];
 
void citire();
long long int determinare();
int verificare (long long 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=m;
      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(long long int x)
{
  long long int nra=x*k;
  int poz=binara (x);
  if (poz!=n)
    nra-=k*(n-poz-1);
  if (nra<=S[poz])
    return 1;
  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;
}