Cod sursa(job #1057910)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 14 decembrie 2013 20:29:43
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include<fstream>

using namespace std;

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

const int nmax = 16000;
int n, k;
int v[nmax];

bool check( int c )
{
    int s, drumuri = 1;
    s = 0;
    for ( int i = 0; i<n; ++i ) {
        if ( s+v[i]>c ) {
            s = v[i];
            ++drumuri;
        } else {
            s += v[i];
        }
    }
    return (drumuri<=k);
}
int main()
{
    int mx, sum;
    fin>>n>>k;
    mx = 0;
    sum = 0;
    for ( int i = 0; i<n; ++i ) {
        fin>>v[i];
        if ( v[i]>mx )
            mx = v[i];
        sum += v[i];
    }
    // cautare binara intre mx si sum
    int n2;
    for ( n2 = 1; 2*n2<=sum; n2 *= 2 ) {
    }
    int sol, pas;
    sol = sum+1;
    for ( pas = n2; pas>0; pas /= 2 ) {
        if ( sol-pas>=mx && check(sol-pas) )
            sol -= pas;
    }
    fout<<sol<<'\n';
    fin.close();
    fout.close();
    return 0;
}