Cod sursa(job #1306188)

Utilizator RaileanuCristian Raileanu Raileanu Data 30 decembrie 2014 17:36:09
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <fstream>
using namespace std;
#define M 16060
int n,k,c,i, v_sal[M], sm[M]  ;
ifstream f1("transport.in");
ofstream f2("transport.out");

int Caut_sm(int st, int dr,int dif, int val_max)
{
    if (st==dr) return st;
    if (st+1==dr)
        if (sm[dr]-dif <= val_max ) return dr;
            else return st;

    int m=(st+dr)/2;
    if (sm[m]-dif <= val_max )
        return Caut_sm(m,dr,dif,val_max );
        else return Caut_sm(st,m-1,dif,val_max);
}

int Caut_Nr_Ture( int capacitate)
{
    int ture=0, p=0;

    while (ture<k+1 && p<n )
    {
        ture++;
        p= Caut_sm(p+1,n,sm[p] ,capacitate );
    }
    return ture;
}

int CautBin(int st, int dr)
{
    if (st==dr)
        return st;

    int m=(st+dr)/2, x= Caut_Nr_Ture(m) ;

    if (x<=k ) return CautBin(st,m);
        else CautBin(m+1,dr);
}

int main()
{
    f1>>n>>k;
    for (i=1; i<=n; i++)
        f1>>v_sal[i];

    for (i=1; i<=n; i++)
        sm[i]=sm[i-1]+v_sal[i];

    int vmax=v_sal[1];
    for (i=2; i<=n; i++)
        if (v_sal[i]>vmax ) vmax=v_sal[i];

    c=CautBin(vmax,sm[n]);
    f2<<c;
    f2.close();
    return 0;
}