Cod sursa(job #736045)

Utilizator harababurelPuscas Sergiu harababurel Data 17 aprilie 2012 19:03:29
Problema Transport Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <iostream>
#include <fstream>
#include <limits.h>
using namespace std;
int main() {
	ifstream f("transport.in");
	ofstream g("transport.out");
	
	int n, k, v[16005], i, j, s, stotal=0, vmax=0, begin, end, mid, pasi;
	
	f>>n>>k; 
	for(i=1; i<=n; i++) {
		f>>v[i];
		stotal+=v[i];
		if(v[i]>vmax) vmax=v[i];
	}
	
	//IDEE: caut binar in intervalul [Vmax, Stotal] cea mai mica valoare pentru care pot incarca saltelele
	//folosind maxim k transporturi
	
	begin = vmax-1;
	end = stotal+1;
	
	while(end-begin > 1) {
		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) {
				s+=v[i];	//epuizez toate saltele care incap in camion
				i--;
			}
			pasi++;
		}
		
		if(pasi>k) begin = mid;
		else end = mid;
		//cout<<mid<<": "<<pasi<<" transporturi\n";
	}
	
	//am gasit un mid bun, dar nu neaparat cel mai bun
	k = pasi;
	while(pasi <= k) {	//incerc sa scad cat pot
		pasi = 0;
		s=0;
		i=n;
		mid--;
		
		while(i>=1) {
			s=0;			//camion gol
			while(s+v[i] <= mid) {
				s+=v[i];	//epuizez toate saltele care incap in camion
				i--;
			}
			pasi++;
		}
	}
	
	mid++;	
	
	
	
	g<<mid<<"\n";
	
	f.close();
	g.close();
	return 0;
}