Cod sursa(job #651309)

Utilizator daniel.dumitranDaniel Dumitran daniel.dumitran Data 20 decembrie 2011 04:06:29
Problema Transport Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define FISIN   "transport.in"
#define FISOUT  "transport.out"

#define MAXN    16000

int n, k;
int vol[MAXN];

int count(int cap) {
  int so_far = 0, left = 0;
  for (int i = 0; i < n; ++i) {
    if (vol[i] <= left) {
      left -= vol[i];
      continue;
    }

    left = cap - vol[i];
    ++so_far;
    if (so_far > k) break;
  }

  return so_far;
}

int main() {
  FILE *fin = fopen(FISIN, "rt");
  FILE *fout = fopen(FISOUT, "wt");

  fscanf(fin, "%d %d", &n, &k);
  for (int i = 0; i < n; ++i)
    fscanf(fin, "%d", vol +i);

  int st = 1, en = 16000 * 16000, mid = 0;
  for (;;) {

    mid = (st + en) / 2;

    bool ok = (count(mid) <= k);
    if (!ok) {
      st = mid + 1;
      continue;
    }

    ok = (count(mid - 1) <= k);
    if (!ok) break;
    en = mid - 1;
  }

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

  fclose(fout);
  fclose(fin);
  return 0;
}