Cod sursa(job #207036)

Utilizator IrnukIrina Grosu Irnuk Data 11 septembrie 2008 12:24:11
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
/*transport*/

#include<fstream.h>

 long v[16005],k,v_max,s,d,st,dr,m;
int n,id;
ifstream fin("transport.in");
ofstream fout("transport.out");

void citire()
{
	int i;
	fin>>n>>k;

	for(i=0;i<n;i++)
	{
		fin>>v[i];
		s+=v[i];
		if(v[i]>v_max)
			v_max=v[i];
	}
}

int verifica(long d)
{
	int i;
	 long sv,cont=0;

	for(i=0;i<n&& cont<k;)
	{
		sv=d;

		while(sv-v[i]>=0&&i<n)
		{
			sv-=v[i];
			i++;}
		cont++;
	}
	if(i<n)
		return 0;
	else
		if(cont<k)
			return 2;
		else
			return 1;
}

int main()
{
	int ok=0;
	citire();

	if(s%k!=0)
		d=s/k+1;
	else
		d=s/k;

	if(d<v_max)
		d=v_max;
	st=v_max;
	dr=s;
	while(ok==0)
	{
	 if(st<=dr)
	 {	m=(st+dr)/2;
		id=verifica(m);
		if(id==0)
			st=m+1;
		else
			if(id==2)
				dr=m-1;
			else
				if(verifica(m-1)==0)
					ok=1;
				else
				{
					dr=m-1;
				}
	 }
	else ok=1;
	}

		

	
	fout<<m<<'\n';
	fout.close();
	return 0;
}