Cod sursa(job #529725)

Utilizator micky000Antal Ioan micky000 Data 5 februarie 2011 20:08:51
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <iostream>
#define Nmax 16005
using namespace std;
 
long long sol = Nmax * Nmax;
int n, k, v[Nmax];
 
int valid(int mid)
{
    int c = 0, j = 1, i;
     
    while(c < k && j <= n)
    {
        long long S = 0;
         
        for(i = j; S < mid && i <= n; ++i)
            S += v[i];
         
        --i;
        if(S > mid)
        {
            S -= v[i];
            --i;
        }
         
        ++c;
         
         
        j = i + 1;
    }
     
    if((j - 1) == n && c <= k)
        return 1;
     
    return 0;
}
 
int bin_search(int st, int dr)
{
    while(st < dr)
    {
        int mid = (st + dr) / 2;
         
        if(valid(mid))
        {  
            if(mid < sol)
                sol = mid;
             
            dr = mid;
        }
        else
            st = mid + 1;
         
    }
     
    return sol;
}
 
int main()
{
    int max = 0, S = 0;
     
    ifstream f("transport.in");
    ofstream g("transport.out");
     
    f >> n >> k;
     
    for(int i = 1; i <= n; ++i)
    {  
        f >> v[i];
         
        S += v[i];
         
        if(max < v[i])
            max = v[i];
         
    }
 
    g << bin_search(max, S);
     
    f.close();
    g.close();
     
    return 0;
     
}