Cod sursa(job #483786)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 10 septembrie 2010 09:58:20
Problema Transport Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
//www.infoarena.ro/problema/transport
//incercare de O(n log n)
#include<iostream>
#include<fstream>
#define nmax 16005

using namespace std;

const char iname[] = "transport.in";
const char oname[] = "transport.out";

ifstream fin(iname);
ofstream fout(oname);

int vol[nmax], N, K, i, sol, left1, right1, middle;
bool access1;

inline bool test(int val)
{	
	int ct = 0;
	int sum = 0;
	for(int i = 1; i <= N; i ++)
	{
		sum = sum + vol[i];
		if(sum > val && i == 1)
			return true;
		if(sum == val)
		{
			sum = 0; //am gasit un transport
			ct ++;
		}
		if(sum > val)
		{
			i --;
			sum = 0;
			ct ++;
		}
		
	}
	if(sum)
		ct ++;
	if(ct > K) //mai mult de K transporturi
		return true;
	return false;
}
	

void solve()
{
	left1 = 0, right1 = nmax;
	while(left1 < right1)
	{
		middle = (left1 + right1) >> 1;
		access1 = test(middle);
		if(access1 == 0)
			right1 = middle;
		else
			left1 = middle + 1;
	}
}

int main()
{
	fin >> N >> K;
	for(i = 1; i <= N; i ++)
		fin >> vol[i];
	solve();
	fout << left1;
	return 0;
}