Cod sursa(job #2081832)

Utilizator moltComan Calin molt Data 5 decembrie 2017 11:05:12
Problema Transport Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int n,k,v[16001],mx;

/*bool fct(int lim)
{
    int i = 1,s = 0,cnt = 0;
    while(i <= n)
    {
        while( s <= lim && i <= n )
        {
            s = s + v[i];
            ++i;
        }
        ++cnt;
        if(s > lim)
            --i;
        s = 0;
    }
    if(cnt <= k)
        return 1;
    return 0;

}*/

bool fct(int cap)
{
    int nr = 0,cc = 0;
    for (int i = 1; i <= n; ++i)
    {
        if (v[i] > cc)
        {
            ++nr;
            cc = cap;
        }
        if (v[i] > cc)
            return false;
        if (nr > k)
            return false;
        cc -= v[i];
    }
    return true;
}

int caut_bin(int s,int mx)
{
    int pas = 1 << 13,r = mx-1;
    while (pas != 0)
    {
        if (fct(r + pas) == 0 && r + pas <= s)
        {
            r += pas;
        }
        pas >>= 1;
    }
    ++r;
    return r;
}

int main()
{
    in>>n>>k;
    int s = 0;
    mx = -1;
    for (int i = 1; i <= n; ++i)
    {
        in>>v[i];
        if (v[i] > mx)
            mx = v[i];
        s += v[i];
    }
    // int st = mx;
    //int dr = s;
    //int mij = ( dr + st ) / 2;
    /*while( st <= dr )
    {
        if( fct(mij) == 1 )
        {
            if( mn > mij )
                mn = mij;
            dr = mij - 1;
        }
        else
            st = mij + 1;
        mij = (dr + st) / 2;
        out<<mn;*/
    out<<caut_bin(s,mx);
    return 0;
}