Cod sursa(job #1300204)

Utilizator wGEORGEWGeorge Cioti wGEORGEW Data 24 decembrie 2014 09:30:50
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <iostream>
#include <fstream>
#define VM 16005
#include <stack>
 
using namespace std;
 
int x[VM];
stack<int> a;
stack<int> b;
 
int maxx = -VM;
 
int n;
int k;
 
int NumarDrumuri(int VolumSaltea){
    if(VolumSaltea < maxx){
        return (1LL<<30);
    }
    int nd = 1;
    int ns = 0;
    for(int i = 1 ; i <= n ; ++i){
        if(ns + x[i] > VolumSaltea){
            ns = 0;
            ++nd;
        }
        ns += x[i];
    }
    return nd;
}
 
int CautareBinara(int left , int right , int k){
    if(left > right){
        return maxx;
    }
    int middle = left + ((right - left) >> 1); ///  Middle = Volum saltea
    int nd = NumarDrumuri(middle);
    if(nd <= k && NumarDrumuri(middle - 1) > k){
        return middle;
    }
    if(nd <= k){
        return CautareBinara(left , middle - 1 , k);
    }
    else{
        return CautareBinara(middle + 1 , right , k);
    }
}
 
int main()
{
    ifstream f("transport.in");
    ofstream g("transport.out");
    f>>n;
    f>>k;
    for(int i = 1 ; i <= n ; ++i){
        f>>x[i];
        maxx = max(maxx , x[i]);
    }
    int VolumMinim = CautareBinara(maxx , VM * VM , k);
    g<<VolumMinim;
    return 0;
}