Cod sursa(job #1298028)

Utilizator CatlinvCatalin Sbera Catlinv Data 22 decembrie 2014 15:03:51
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 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;
}