Cod sursa(job #1761769)

Utilizator AhileGigel Frone Ahile Data 22 septembrie 2016 20:37:27
Problema Transport Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include<bits/stdc++.h>
using namespace std;
#define in f
#define out cout

ifstream f("transport.in");
ofstream g("transport.out");

int const inf = 1000000;
int n;
int k;
int v[16010];

int valid(int x) {

    int drum = 1;
    int aux = x;
    for(int i = 1; i <= n; ++i) {
        if(aux >= v[i]) {
            aux -= v[i];
        } else {
            aux = x - v[i];
            drum++;
        }
    }
    if(drum <= k) {
        return true;
    } else {
        return false;
    }
}

int binsearch(int start, int fin) {

    int mid = (fin + start) / 2;
    while(fin - start > 1) {
        mid = (fin + start) / 2;
        if(valid(mid)) {
            fin = mid;
        } else {
            start = mid;
        }
    }
    if(valid(start)) {
        return start;
    }  else {
        return fin;
    }

}

int main() {

    in >> n;
    in >> k;

    for(int i = 1; i <= n; ++i) {
        in >> v[i];
    }
    out << binsearch(0, inf);

}
/*
bool possible(int x)
{
    int vol = 0;
    int trans = 1;
    bool ok = true;
    for(int i=1; i<=n; i++)
    {

        if(v[i] > x)
        {
            ok = false;
            break;
        }

        if(vol + v[i] <= x)
        {
            vol += v[i];
        }
        else
        {
            trans++;
            vol = v[i];
        }

        if(trans > k )
        {
            ok = false;
            break;
        }
    }

    return ok;
}

int main()
{
    f >> n;
    f >> k;
    int sum = 0;

    for(int i=1; i<=n; i++)
    {
        f >> v[i];
        sum += v[i];
    }

    int right = sum;
    int left = 0;

    while(right - left > 1)
    {

        int mid = (right + left) / 2;
        if(possible(mid))
        {
            right = mid;
        }
        else
        {
            left = mid;
        }

    }

    if(possible(left))
        g << left;
    else g << right;

    return 0;

}
*/