Cod sursa(job #1798701)

Utilizator maryan_lupMarian Lupascu maryan_lup Data 5 noiembrie 2016 12:57:07
Problema Transport Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <iostream>
#include <fstream>
#define DIMMAX 16005
#define ll long long
#define FOR(i,a,b) for(int i=a;i<=b;i++)

using namespace std;

int N, C, K, s[DIMMAX], maxim=-1;
ll Maxim;

void citire()
{
    ifstream f("transport.in");
    f>>N>>K;
    FOR(i,1,N)
    {
        f>>s[i];
        Maxim+=s[i];
        if(s[i] > maxim)
            maxim=s[i];
    }
    f.close();
}

void afisare()
{
    ofstream g("transport.out");
    g<<C;
    g.close();
}

ll calcul_nr_trans(int x)
{
    ll sum=0,tr=0;
    FOR(i,1,N)
    {
        sum+=s[i];
        if(sum>x)
        {
            sum=s[i];
            tr++;
        }
        else
            if(sum==x)
            {
                sum=0;
                tr++;
            }
    }
    if(sum)tr++;
    if(!tr)return 1;
    return tr;
}

int cautareBinara(ll s, ll d)
{
    ll m=(s+d)/2;
    ll x=calcul_nr_trans(m);
    if(x==K)return m;
    else
        if(x<K)
            cautareBinara(s, m-1);
        else
            cautareBinara(m+1, d);
}

int main()
{
    citire();

    for(int i=cautareBinara(maxim, Maxim), ok=1; i>=maxim && ok; --i)
    {
        if(calcul_nr_trans(i)!=K)C=i+1;
    }

    afisare();

    return 0;
}