Cod sursa(job #95369)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 28 octombrie 2007 14:12:55
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include<stdio.h>

int v[16010], k, n, max, nr, s;

void citire()
{
  freopen("transport.in","r",stdin);
  freopen("transport.out","w",stdout);
  scanf("%d %d",&n,&k);
  int i;
  for (i=1; i<=n; i++){ scanf("%d",v+i); if (max<v[i]) max=v[i];s+=v[i];}
  if (s/k>max) nr=s/k;
  else nr=max;
}


int verif(int x)
{
  int i, j, s;
  i=1;
  j=0;
  int ok2=1;
  while (i<=n && ok2)
  {
    s=0;
    while (s<x && i<=n) {s+=v[i]; i++;}
    if (s>x) i--;
    j++;
    if (j>k) ok2=0;
  }
  if (i>n && ok2) return 1;
  return 0;
}

int cauta(int p, int u)
{
  int m;
  m=(p+u)/2;
  while (p<=u)
  {
    if (verif(m)) if (!verif(m-1)) return m;
		  else {u=m-1; m=(p+u)/2;}
    else {p=m+1; m=(p+u)/2;}
  }
  return 0;
}
   


void calcul()
{
  int rez;
  rez=cauta(nr,s);
  
  printf("%d\n",rez);
}

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