Cod sursa(job #145492)

Utilizator marinMari n marin Data 28 februarie 2008 21:05:26
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<stdio.h>
#define DIM 16001


int n,k,a[DIM],max;
long s;



int main()
{
  FILE *f=fopen("transport.in", "r");
  FILE *g=fopen("transport.out", "w");
  fscanf(f, "%d %d", &n, &k);
  max=-1;
  s=0;
  for(int i=1;i<=n;++i) {
    fscanf(f, "%d", &a[i]);
    if(a[i]>max)
      max=a[i];
    s+=a[i];
  }

  long pmin,pmax,pm,cnt,ss;

  pmin=max;
  pmax=s;
  pm=(pmax+pmin)/2;
  while(pm!=pmax&&pm!=pmin){
    cnt=0;
    ss=0;
    for(int i=1;i<=n;++i){
      if(ss+a[i]<=pm){
	ss+=a[i];
      }
      else{
	++cnt;
	ss=a[i];
      }
    }
    ++cnt;
    if(cnt<=k){
      pmax=pm;
      pm=(pmin+pmax)/2;
    }
    else{
      pmin=pm;
      pm=(pmin+pmax)/2;
    }
  }
  if(pm==pmin){
    cnt=0;
    ss=0;
    for(int i=1;i<=n;++i){
      if(ss+a[i]<=pm){
	ss+=a[i];
      }
      else {
	++cnt;
	ss=a[i];
      }
    }
    ++cnt;
    if(cnt<=k)
      fprintf(g, "%ld\n", pmin);
    else
      fprintf(g, "%ld\n", pmax);
  }
  else
  fprintf(g, "%ld\n", pmax);

  fclose(f);
  fclose(g);
  return 0;
}