Cod sursa(job #1002826)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 28 septembrie 2013 21:36:43
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <iostream>
#include <fstream>
#define NMax 16010

using namespace std;

int n, k, answer;
int stiva[NMax];

inline void Read()
{
    ifstream f ("transport.in");
    f>>n>>k;
    int i;
    for (i=1; i<=n; ++i)
        f>>stiva[i];
    f.close();
}

inline bool Possible (int capacity)
{
    int i, ccapatcity = capacity, nrtransp = 0;
    for (i=1; i<=n; ++i)
    {
        if (ccapatcity - stiva[i] >= 0)
            ccapatcity -= stiva[i];
        else
        {
            ccapatcity = capacity - stiva[i];
            ++nrtransp;
            if (nrtransp > k)
                return false;
        }
    }
    ++nrtransp;
    if (nrtransp > k)
        return false;
    return true;
}

inline void Solve()
{
    int Left, Right, Middle;
    Left = Right = 0;
    for (int i=1; i<=n; ++i)
    {
        Right += stiva[i];
        Left = max(Left, stiva[i]);
    }
    while (Left <= Right)
    {
        Middle = (Left + Right) >> 1;
        if (Possible(Middle))
        {
            answer = Middle;
            Right = Middle - 1;
        }
        else
            Left = Middle + 1;
    }
}

inline void Write()
{
    ofstream g ("transport.out");
    g<<answer<<"\n";
    g.close();
}

int main()
{
    Read();
    Solve();
    Write();
    return 0;
}