Cod sursa(job #2016043)

Utilizator TincaMateiTinca Matei TincaMatei Data 28 august 2017 14:47:40
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <stdio.h>
#include <ctype.h>

#define NMAX  16000
#define SALTEA_MAX INFINIT
#define INFINIT 256000001

int stiva [ NMAX ] ;

int N, K, min, min2 ;

char testare (int cap ) {

  int i, s, transport ;

  s = 0 ;
  transport = 0 ;

  for (i = 0 ; i < N and 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 (0 < s && s <= cap ) { /// Ultimele saltele
    transport++;
    s = 0 ;
  }

  if (i == N and transport <= K)/// Daca am facut mai putin de k transporturi
    return 1 ; /// In care parte mergem
  return 2 ;
}

int caut_bin (int st, int dr ) {
  /// Cautam binar capacitatea
  int pivot ;
  pivot = (st + dr ) / 2 ;
  if (st < dr-1 ) {
    if  (testare(pivot) == 1 )  { /// Testam sa vedem daca e minima
      return caut_bin(st, pivot ) ;
    }
    else {
      return caut_bin(pivot, dr ) ;
    }
  }
  return 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] ) ;
  }

  int rez = caut_bin(0, SALTEA_MAX + 1 ) ;

  fprintf (fout, "%d", rez ) ;
  return 0 ;
}