Pagini recente » Cod sursa (job #2862963) | Cod sursa (job #1448622) | Cod sursa (job #2466143) | Cod sursa (job #2309167) | Cod sursa (job #2665387)
#include <stdio.h>
#include <stdlib.h>
#define N 16000
#define MAX 256000000 //16000^2
int sum[N + 1], k, n;
int is_good(int volume){
int ind = 1, transports = 0;
int start, end, mij;
//printf("pt volumul %d\n", volume);
while (transports < k && ind <= n){
start = ind; end = n;
//if (volume == 7) printf("ind = %d\n", ind);
while (end - start > 1){
mij = (start + end) / 2;
//if (volume == 7) printf("%d < %d ?\n", sum[mij] - sum[ind - 1], volume);
if (sum[mij] - sum[ind - 1] < volume) start = mij + 1;
else end = mij;
//if (volume == 7) printf("pt mij = %d, %d %d\n", mij, start, end);
//printf("pt mij = %d, %d %d\n", mij, start, end);
}
if (sum[start] - sum[ind - 1] >= volume) ind = start;
else ind = end;
transports ++;
}
if (ind >= n) return 1;
//printf("pt %d nu e bun \n", volume);
return 0;
}
int main()
{
FILE *fin, *fout;
fin = fopen("transport.in", "r");
fout = fopen("transport.out", "w");
fscanf(fin, "%d%d", &n, &k);
int i, x;
for (i = 1; i <= n; i ++){
fscanf(fin, "%d", &x);
sum[i] = sum[i-1] + x;
}
//printf("%d\n", sum[3] - sum[0]);
int start = 0, end = MAX, mij;
while (end - start > 0){
mij = (start + end) / 2;
if (is_good(mij)) end = mij;
else start = mij + 1;
}
//printf("%d", is_good(8));
fprintf(fout, "%d", end);
return 0;
}