Pagini recente » Cod sursa (job #345484) | Cod sursa (job #906103) | Cod sursa (job #2611736) | Cod sursa (job #1348442) | Cod sursa (job #3286701)
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
#include <assert.h>
#define DEBUG 0
uint8_t can_fit_in_k_transports(uint64_t n, uint64_t k, uint64_t *vals, uint64_t g);
uint64_t sol(uint64_t n, uint64_t k, uint64_t *vals);
uint8_t
can_fit_in_k_transports(uint64_t n, uint64_t k, uint64_t *vals, uint64_t g)
{
uint64_t current_sum, current_transport_number;
size_t i;
current_sum = 0;
current_transport_number = 1;
for (i = 0; i < n; i++) {
current_sum += vals[i];
if (current_sum > g) {
current_transport_number++;
current_sum = vals[i];
if (current_transport_number > k)
return 0;
}
}
return 1;
}
uint64_t
sol(uint64_t n, uint64_t k, uint64_t *vals)
{
uint64_t sum, st, dr, mij, ret;
size_t i;
sum = 0;
for (i = 0; i < n; i++)
sum += vals[i];
st = 1;
dr = sum;
ret = 0;
while (st <= dr) {
mij = (dr - st) / 2 + st;
if (can_fit_in_k_transports(n, k, vals, mij)) {
ret = mij;
dr = mij - 1;
} else {
st = mij + 1;
}
}
return ret;
}
int
main(void)
{
FILE *fin, *fout;
uint64_t n, k, *vals, i;
fin = fopen("transport.in", "r");
fout = fopen("transport.out", "w+");
assert(fin != NULL);
assert(fout != NULL);
assert(fscanf(fin, "%" SCNu64 " %" SCNu64 "\n", &n, &k) == 2);
vals = malloc(n * sizeof(*vals));
assert(vals != NULL);
for (i = 0; i < n; i++)
assert(fscanf(fin, "%" SCNu64, &vals[i]) == 1);
fprintf(fout, "%" PRIu64 "\n", sol(n, k, vals));
#if DEBUG
printf("%" PRIu64 "\n", sol(n, k, vals));
#endif
assert(fclose(fin) == 0);
assert(fclose(fout) == 0);
return 0;
}