Cod sursa(job #527533)

Utilizator Catah15Catalin Haidau Catah15 Data 31 ianuarie 2011 20:21:16
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <fstream>
#include <iostream>
#define Nmax 16005
using namespace std;

long long sol = Nmax * Nmax;
int n, k, v[Nmax];

int valid(int mid)
{
	int c = 0, j = 1, i;
	
	while(c < k && j <= n)
	{
		long long S = 0;
		
		for(i = j; S < mid && i <= n; ++i)
			S += v[i];
		
		--i;
		if(S > mid)
		{
			S -= v[i];
			--i;
		}
		
		++c;
		
		
		j = i + 1;
	}
	
	if((j - 1) == n && c <= k)
		return 1;
	
	return 0;
}

int bin_search(int st, int dr)
{
	while(st < dr)
	{
		int mid = (st + dr) / 2;
		
		if(valid(mid))
		{	
			if(mid < sol)
				sol = mid;
			
			dr = mid;
		}
		else
			st = mid + 1;
		
	}
	
	return sol;
}

int main()
{
	int max = 0, S = 0;
	
	ifstream f("transport.in");
	ofstream g("transport.out");
	
	f >> n >> k;
	
	for(int i = 1; i <= n; ++i)
	{	
		f >> v[i];
		
		S += v[i];
		
		if(max < v[i])
			max = v[i];
		
	}

	g << bin_search(max, S);
	
	f.close();
	g.close();
	
	return 0;
	
}