Cod sursa(job #3286701)

Utilizator timothy_josephTimotei-Iosif Cicu timothy_joseph Data 14 martie 2025 15:48:30
Problema Transport Scor 80
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#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;
}