Cod sursa(job #211985)

Utilizator 0000go gcc 0000 Data 3 octombrie 2008 23:09:45
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.78 kb
#include <stdio.h>
int v[16001],n,nrt,c,max,sumav;
int sol=1<<30;
void citire()
{
	freopen("transport.in","r",stdin);
	freopen("transport.out","w",stdout);
	scanf("%d%d",&n,&nrt);
	for (int i=1; i<=n; i++)
	{
		scanf("%d",&v[i]);
		if (v[i]>max)
			max=v[i];
		sumav+=v[i];
	}
}

int valid(int x){  
     int l=n,t=0,s;  
     while(l){  
         s=0;  
         while(l && s+v[l]<=x){  
            s+=v[l];  
            l--;  
        }  
        if(!s) return 0;  
        t++;  
    }  
    if(t<=nrt){  
        if(x<sol) sol=x;  
        return 1;  
    }  
    return 0;  
}  

void cautbin()
{
	int st,dr,m;
	st=max; dr=sumav;
	while (st<dr)
	{
		m=(st+dr)/2;
		if(valid(m) )
			dr=m;
		else
			st=m+1;
	}
	printf("%d ",sol);
}
int main()
{
	citire();
	cautbin();
}