Cod sursa(job #1454221)

Utilizator allexx2200Atanasiu Alexandru-Marian allexx2200 Data 25 iunie 2015 19:52:35
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <stdio.h>

#define SUCCES 0
#define ERROR 1

#define FIN "transport.in"
#define FOUT "transport.out"

#define NMAX 16000

/* Numarul de saltele si numarul de transporturi dorite */
int N, K;
/* Vectorul cu rol de stiva care retine informatia despre saltele */
int stiva[NMAX];

FILE *in, *out;

int solution;

int lower, higher;

int no_transp(int capacity){
    int res = 0;
    for(int i=0, incarc = 0; i < N; i++){
        if((stiva[i] + incarc) <= capacity){
            incarc += stiva[i];
        } else {
            incarc = stiva[i];
            res++;
        }
    }

    return res + 1;
}

void solve(){
    while(lower < higher-1){
        int mid = lower + (higher - lower) / 2;
        int tran = no_transp(mid);
        if(tran <= K){
            higher = mid;
        } else {
            lower = mid;
        }
    }

    if(no_transp(lower) <= K){
        solution = lower;
    } else {
        solution = higher;
    }
}

int main(){
    in = fopen(FIN, "rt");
    out = fopen(FOUT, "wt");
    if(!in || !out) return ERROR;

    fscanf(in, "%d%d", &N, &K);
    for(int i=0; i < N; i++){
        fscanf(in, "%d", &stiva[i]);
        if(stiva[i] > solution){
            lower = stiva[i];
            solution = stiva[i];
        }
        higher += stiva[i];
    }

    solve();

    fprintf(out, "%d", solution);

    fclose(in);
    fclose(out);
    return SUCCES;
}