Cod sursa(job #2018705)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 5 septembrie 2017 18:13:18
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <bits/stdc++.h>
#define MAX 16001
#define INIT 256000000
using namespace std;

FILE *f1 = fopen("transport.in", "r");
FILE *f2 = fopen("transport.out", "w");

int n, k, i, j, v[MAX], Min = INIT, Max = -1;

int transport(int val)
{
    int sum = 0, i, t = 1;
    for (i = 1; i <= n; i++)
    {
        if (sum + v[i] <= val)
            sum += v[i];
        else
        {
            t++;
            sum = v[i];
            if (t > k)
                break;
        }
    }
    if (t <= k)
        return 1;
    return 0;
}

void cautB(int l, int r)
{
    int mij = l + (r - l) / 2;
    if (l > r)
        return;

    int res = transport(mij);
    if (res == 0)
        cautB(mij + 1, r);
    else
    {
        if (Min > mij)
            Min = mij;
        cautB(l, mij - 1);
    }
}

int main()
{
    fscanf(f1, "%d%d", &n, &k);
    for (i = 1; i <= n; i++)
    {
        fscanf(f1, "%d", &v[i]);
        if (Max < v[i])
            Max = v[i];
    }
    fclose(f1);

    cautB(Max, INIT);

    fprintf(f2, "%d\n", Min);

    fclose(f2);
    return 0;
}