Pagini recente » Cod sursa (job #1282562) | Monitorul de evaluare | Cod sursa (job #2315384) | Cod sursa (job #949551) | Cod sursa (job #3331612)
/******************************************************************************
Online C Compiler.
Code, Compile, Run and Debug C program online.
Write your code in this editor and press "Run" button to compile and execute it.
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
int verifica(int cap, int n, int k, int *volume) {
int transporturi = 1;
int suma_curenta = 0;
for (int i = 0; i < n; i++) {
if (volume[i] > cap) return 0;
if (suma_curenta + volume[i] <= cap) {
suma_curenta += volume[i];
} else {
transporturi++;
suma_curenta = volume[i];
}
}
return transporturi <= k;
}
int main() {
FILE *fin = fopen("transport.in", "r");
FILE *fout = fopen("transport.out", "w");
int n, k;
fscanf(fin, "%d %d", &n, &k);
int *volume = (int *)malloc(n * sizeof(int));
int max_vol = 0;
long long suma_totala = 0;
for (int i = 0; i < n; i++) {
fscanf(fin, "%d", &volume[i]);
if (volume[i] > max_vol)
{
max_vol = volume[i];
}
suma_totala = suma_totala + volume[i];
}
int stanga = max_vol;
int dreapta = (int)suma_totala;
int ans = (int)suma_totala;
while (stanga <= dreapta) {
int mid = (dreapta + stanga) / 2;
if (verifica(mid, n, k, volume))
{
ans = mid;
dreapta = mid - 1;
} else {
stanga = mid + 1;
}
}
fprintf(fout, "%d\n", ans);
free(volume);
fclose(fin);
fclose(fout);
return 0;
}