Cod sursa(job #2144866)

Utilizator Teodor.mTeodor Marchitan Teodor.m Data 26 februarie 2018 23:00:49
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <bits/stdc++.h>
using namespace std;
 
ifstream in("transport.in");
ofstream out("transport.out");

// Caut binar capacitatea camionului
// Pentru o cantitate mij la un moment dat, determin cate drumuri necesita sa faca camionul
// Daca numarul drumurilor <= k atunci capacitatea poate sa mai scada
// Altfel inseamna ca trebuie sa mai creasca

int CautaBinarCapacitate(const vector< int > &v, int n, int k, int maxVolumSaltea) {
	int lo = maxVolumSaltea;
	int hi = 16000 * 16000;

	while(lo <= hi) {
		int mid = (lo + hi) / 2;
		int nr = 1;
		int sumLeft = mid - v[0];

		for(int i = 1; i < n; ++i) {
			if(v[i] <= sumLeft) {
				sumLeft -= v[i];
			} else {
				sumLeft = mid - v[i];
				nr++;
			}
		}

		if(nr <= k) {
			hi = mid - 1;
		} else {
			lo = mid + 1;
		}
	}

	return lo;
}

int main() {

	int n, k; in >> n >> k;

	vector< int > v(n);
	int maxVolumSaltea = 0;
	for(int i = 0; i < n; ++i) {
		in >> v[i];
		maxVolumSaltea = max(maxVolumSaltea, v[i]);
	}

	out << CautaBinarCapacitate(v, n, k, maxVolumSaltea) << '\n';

    in.close(); out.close();
 
    return 0;
}