Cod sursa(job #1498579)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 8 octombrie 2015 19:54:54
Problema Transport Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <stdio.h>
#define MAXN 16000

short v[16000];

short sim ( int n, int nr ) {
  int i;
  short nt = 0; /// nr. transporturi
  int acc = 0; /// acumulatorul

  for ( i = 0; i < n; i++ ) {
    acc += v[i];

    if ( acc > nr ) { /// overflow
      nt++;
      acc = v[i]; /// scad ce am dus
    }
  }

  if ( acc > 0 ) /// mai imi ramane un transport
    nt++;

  //printf("nr de transporturi %d pentru cap %d\n", nt, nr );

  return nt;
}

int main () {
  FILE *fin, *fout;

  fin = fopen ( "transport.in", "r" );
  fout = fopen ( "transport.out", "w" );

  int n, k;

  fscanf( fin, "%d%d", &n, &k );

  int i, max = -1, s = 0;

  for ( i = 0; i < n; i++ ) {
    fscanf( fin, "%hd", &v[i] );
    s += v[i];
    if ( max < v[i] )
      max = v[i];
  }

  //printf("s = %hd, max = %hd\n", s, max );

  int st = max, dr = s, mij, min = dr;

  while ( st <= dr ) {
    mij = ( st + dr ) / 2;
    if ( sim ( n, mij ) <= k ) {
      dr = mij - 1;
      min = mij;
    }
    else
      st = mij + 1;
  }

  fprintf( fout, "%d\n", min );

  fclose ( fin );
  fclose ( fout );

  return 0;
}