Cod sursa(job #207029)

Utilizator IrnukIrina Grosu Irnuk Data 11 septembrie 2008 12:09:15
Problema Transport Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 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 verifica1()   
{   
    int i;   
     long sv,cont=0;   
  
    for(i=0;i<n&& cont<k;)   
    {   
        sv=d;   
  
        while(sv-v[i]>=0&&i<n&&sv!=0)   
        {   
            sv-=v[i];   
            i++;}   
        cont++;   
    }   
    if(i<n)   
        return 0;   
    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=d;
	dr=s;
	while(ok==0)
	{
		m=(st+dr)/2;
		id=verifica(m);
		if(id==0)
			st=m+1;
		else
			if(id==2)
				dr=m-1;
			else
				ok=1;
	}
		
	d=m;
	while(verifica1()==1)
		d--;

	
	fout<<d+1<<'\n';
	fout.close();
	return 0;
}