Cod sursa(job #2016084)

Utilizator alex.cojocaruAlex Cojocaru alex.cojocaru Data 28 august 2017 15:57:31
Problema Transport Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <stdio.h>

#define NMAX  16000
#define SALTEA_MAX 256000000
#define INFINIT 256000000

int stiva [ NMAX ] ;

int N, K, min, min2 ;

char testare (int cap ) {

  int i, s, transport ;

  s = 0 ;
  transport = 0 ;
  i = 0 ;

  while (i < N && stiva[i] <= cap ) { /// Inseram saltele pana cand nu mai incap
    if (s + stiva[i] <= cap ) {
      s += stiva[i] ;
      i++;
    }else {
      if (s > 0 ) { /// Le transportam
        transport++;
        s = 0 ;
      }
    }
  }
  if (s <= cap && s > 0 ) { /// Ultimele saltele
    transport++;
    s = 0 ;
  }
  if (transport <= K && stiva[i] <= cap ) { /// Daca am facut mai putin de k transporturi
    if (cap < min2 ) {
      min = transport ;
      min2 = cap ;
    }
    return 0 ; /// In care parte mergem
  }
  return 1 ;
}

void caut_bin (int st, int dr ) {
  /// Cautam binar capacitatea
  int pivot ;
  pivot = (st + dr ) / 2 ;
  if (st < dr-1 ) {
    if  (testare(pivot) == 0 )  { /// Testam sa vedem daca e minima
      caut_bin(st, pivot ) ;
    }
    else {
      caut_bin(pivot, dr ) ;
    }
  }
}

int main() {

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

  int i ;
  min =  INFINIT ;
  min2 = INFINIT ;

  fscanf (fin, "%d%d", &N, &K ) ;

  for (i = 0 ; i < N ; i++ ) {
    fscanf (fin, "%d", &stiva[i] ) ;
  }

  caut_bin(1, SALTEA_MAX + 1 ) ;

  fprintf (fout, "%d", min2 ) ;

  return 0 ;
}