Cod sursa(job #164203)

Utilizator FlorinC1996Florin C FlorinC1996 Data 23 martie 2008 17:43:17
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include<stdio.h>   
  
#define INPUT "transport.in"   
#define OUTPUT "transport.out"   
  
FILE *fin=fopen(INPUT, "r"),*fout=fopen(OUTPUT, "w");   
  
int n,k,a[16001],max;   
long s;   
  
void citire();   
void cautare();   
  
int main()   
{   
  citire();   
  cautare();   
  fclose(fin);   
  fclose(fout);   
  return 0;   
}   
  
void citire()   
{   
  fscanf(fin, "%d %d", &n, &k);   
  max=-1;   
  s=0;   
  for(int i=1;i<=n;++i)   
  {   
    fscanf(fin, "%d", &a[i]);   
    if(a[i]>max)   
      max=a[i];   
    s+=a[i];   
  }   
}   
  
void cautare()   
{   
  long pozmin,pozmax,pozmij,contor,suma;   
  pozmin=max;   
  pozmax=s;   
  pozmij=(pozmax+pozmin)/2;   
  while(pozmij!=pozmax&&pozmij!=pozmin)   
  {   
    contor=0;   
    suma=0;   
    for(int i=1;i<=n;++i)   
    {   
      if(suma+a[i]<=pozmij)   
      {   
        suma+=a[i];   
      }   
      else  
      {   
        ++contor;   
        suma=a[i];   
      }   
    }   
    ++contor;   
    if(contor<=k)   
    {   
      pozmax=pozmij;   
      pozmij=(pozmin+pozmax)/2;   
    }   
    else  
    {   
      pozmin=pozmij;   
      pozmij=(pozmin+pozmax)/2;   
    }   
  }   
  if(pozmij==pozmin)   
  {   
    contor=0;   
    suma=0;   
    for(int i=1;i<=n;++i)   
    {   
      if(suma+a[i]<=pozmij)   
      {   
        suma+=a[i];   
      }   
      else  
      {   
        ++contor;   
        suma=a[i];   
      }   
    }   
    ++contor;   
    if(contor<=k)   
      fprintf(fout, "%ld\n", pozmin);   
    else  
      fprintf(fout, "%ld\n", pozmax);   
  }   
  else  
  fprintf(fout, "%ld\n", pozmax);   
}