Cod sursa(job #196042)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 24 iunie 2008 09:33:17
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include<stdio.h>
#include<string.h>
#define N 16005
int main(){
	int nr,n,k,i,j,v[N],c,s=0,vec=0,sp,ma,li,ls,lm,sum,sc;
	freopen("transport.in","r",stdin);
	freopen("transport.out","w",stdout);
	scanf("%d%d",&n,&nr);
	for(i=0;i<n;i++){
		scanf("%d",&v[i]);
		if(v[i]>vec)
			vec=v[i];
		s+=v[i];
	}
	ma=s/nr;
	if(ma*nr<s)
		ma++;
	if(nr==1)
		c=s;
	else
		if(nr>=n)
			c=vec;
	else{
		if(ma>vec)
			vec=ma;
		li=vec;
		lm=n/nr;
		if(lm*nr<n)
			lm++;
		sc=0;
		for(i=0;i<lm;i++)
			sc+=v[i];
		sum=sc;
		for(i=lm;i<n;i++){
			sc=sc-v[i-lm]+v[i];
			if(sum<sc)
				sum=sc;
		}
		ls=sum;
		if(li==ls)
			c=li;
		else
			while(li<ls){
				c=(li+ls)/2;
				k=0;
				i=0;
				j=0;
				while(i<n){
					sp=0;
					while(j<n&&sp<c){
						sp+=v[j];
						j++;
					}
					if(sp>c)
						j--;
					k++;
					if(k>nr){
						li=c+1;
						break;
					}
				i=j;
				}
			if(li==ls){
				c=li;
				break;
			}
			if(k<=nr)
				ls=c;
			}
	}
	printf("%d",c);
	return 0;
}