Cod sursa(job #1798732)

Utilizator maryan_lupMarian Lupascu maryan_lup Data 5 noiembrie 2016 13:14:21
Problema Transport Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 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)
{
    if(s<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);
    }
    else return -1;

}

int main()
{
    citire();

    if(K==1)
    {
        C=Maxim;
        afisare();
        return 0;
    }

    C=cautareBinara(maxim, Maxim);
    if(C==-1)
    {
        C=1;
        afisare();
        return 0;
    }
    int ok=1;
    while(ok)
    {
        if(calcul_nr_trans(C-1)==K)C--;
        else ok=0;
    }

    if(C<maxim)C=maxim;

    afisare();

    return 0;
}