Cod sursa(job #736072)

Utilizator harababurelPuscas Sergiu harababurel Data 17 aprilie 2012 19:25:11
Problema Transport Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <iostream>
#include <fstream>
using namespace std;
int main() {
	ifstream f("transport.in");
	ofstream g("transport.out");
	
	long long n, k, v[16005], i, s, stotal=0, vmax=0, begin, end, mid, pasi;
	
	f>>n>>k; 
	for(i=n; i>=1; i--) {
		f>>v[i];
		stotal+=v[i];
		if(v[i]>vmax) vmax=v[i];
	}
	v[0]=0;
	
	//IDEE: caut binar in intervalul [Vmax, Stotal] cea mai mica valoare pentru care pot incarca saltelele
	//folosind maxim k transporturi
	
	begin = vmax-1;		//volumul camionului >= volumul celei mai mari saltele (daca o incarca doar pe cea mai mare)
	end = stotal+1;		//volumul camionului <= suma tuturor volumelor saltelelor (daca le incarca pe toate)
	
	while(begin<end) {
		mid = (begin+end)/2;	//mid ii volumul camionului
		
		pasi = 0;
		i = n; //incep din varful stivei
		s = 0;
		
		while(i>=1) {
			s=0;			//camion gol
			while(s+v[i] <= mid && i>=1) {
				s+=v[i];	//epuizez toate saltele care incap in camion
				i--;
			}
			pasi++;
			if(pasi>k) break; //un pic de optimizare, ma opresc cand am depasit limita k
		}
		
		if(pasi>k) begin = mid+1;
		else end = mid-1;
		//cout<<mid<<": "<<pasi<<" transporturi\n";
	}
	
	
	

	g<<mid<<"\n";
	
	f.close();
	g.close();
	return 0;
}