Cod sursa(job #1495085)

Utilizator TopiAlexTopala Alexandru TopiAlex Data 2 octombrie 2015 15:58:31
Problema Transport Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <stdio.h>
#define N_MAX 16002
using namespace std;

FILE *f, *g;
int v[N_MAX];
int sPart[N_MAX];
int n, k;
int max = -1;

//bool found = false;

void citire();
int transporta(int);

int main()
{
    int st, dr, m;
    int t;
    //int lm;
    citire();

    t = N_MAX;

    st = max;
    dr = sPart[n];

    while (st < dr - 1){
        m = (st + dr)/2;

        t = transporta(m);

        if (t > k)
            st = m + 1;
        else
            dr = m;

        //lm = m;
    }

    fprintf(g, "%d\n", m);

    fclose(g);

    return 0;
}

void citire(){
    f = fopen("transport.in", "r");
    g = fopen("transport.out", "w");

    fscanf(f, "%d%d", &n, &k);

    for (int i = 1; i <= n; ++i){
        fscanf(f, "%d", &v[i]);
        sPart[i] = sPart[i-1] + v[i];
        if (v[i] > max)
            max = v[i];
    }

    fclose(f);
}

int transporta(int m){
    int ck = 0;
    int saltea = 0;
    int i;

    while (ck <= k && saltea <= n){
        i = saltea + 1;
        while (sPart[i] - sPart[saltea] <= m && i <= n)
            ++i;

        saltea = i;
        ck++;
    }

    return ck;
}