Cod sursa(job #1254724)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 3 noiembrie 2014 12:09:14
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <fstream>
using namespace std;
#define Nmax 16001

int n, k, maxV = 0;
int v[Nmax], s[Nmax];

void read() ;
bool ok(int) ;

int main()
{
    int a, b, m;
    
    read();
    
    a = maxV; b = s[n];
    
    while(a < b)
    {
        m = (a + b) >> 1;
        if(ok(m)) b = m;
        else a = m + 1;
    }
    
    ofstream fout("transport.out");
    
    fout << a << '\n';
    
    fout.close();
    return 0;
}

void read()
{
    ifstream fin("transport.in");
    
    fin >> n >> k;
    for(int i = 1; i <= n; ++i)
    {
        fin >> v[i];
        if(v[i] > maxV) maxV = v[i];
        
        s[i] = s[i-1] + v[i];
    }
    
    fin.close();
}

bool ok(int c)
{
    int st, dr, nr = 0, S;
    for(st = 1; st <= n; )
    {
        S = 0;
        for(dr = st; S + v[dr] <= c && dr <= n; ++dr)
            S += v[dr];
        //intervalul [st, dr) are capacitatea <= c
        
        if(st == dr) return 0;
        st = dr; ++nr;
    }
    return (nr <= k);
}