Cod sursa(job #2665387)

Utilizator andrei_ciobanuciobanu andrei andrei_ciobanu Data 30 octombrie 2020 17:51:29
Problema Transport Scor 0
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#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;
}