Cod sursa(job #2633751)

Utilizator euyoTukanul euyo Data 8 iulie 2020 14:18:42
Problema Transport Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <fstream>

using namespace std;

ifstream fin( "transport.in" );
ofstream fout( "transport.out" );

const int MaxN = 16000;

int s[MaxN];

static inline int canTransport( int n, int k, int cp ) {  
  int i, t = 1, ccp = cp;
  
  for ( i = 0; i < n; ++i ) {
	if ( ccp - s[i] >= 0 ) {
      ccp -= s[i];
	} else {
	  ccp = cp - s[i];
	  ++t;
	}
  }
  if ( t <= k ) {
	return 1;
  }
  return 0;
}

void solve( int n, int k, int sum, int max ) {
  int st = max, dr = sum, mij;

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

int main() {
  int n, k, i, sum = 0, max = 0;

  fin >> n >> k;
  for ( i = 0; i < n; ++i ) {
	fin >> s[i];
	max = max < s[i] ? s[i] : max;
	sum += s[i];
  }
  solve( n, k, sum, max );
  fin.close();
  fout.close();
  return 0;
}