Cod sursa(job #186300)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 27 aprilie 2008 14:06:37
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include<stdio.h>

#define NMAX 16000
#define FIN "transport.in"
#define FOUT "transport.out"

int main(){
freopen(FIN,"r",stdin);
freopen(FOUT,"w",stdout);
int n,nrtr,k,i,v[NMAX],c,j,s=0,vmax=0,sp,ma,li,ls,lm,smax,sc,gata;
scanf("%d%d",&n,&nrtr);
for(i=0;i<n;i++) {
	scanf("%d",&v[i]);
	if(v[i]>vmax) vmax=v[i];
	s+=v[i];
	}
ma=s/nrtr;
if(ma*nrtr<s) ma++;

if(nrtr==1) c=s;
else if(nrtr>=n) c=vmax;
	 else{
		if(ma>vmax) vmax=ma;
		li=vmax;
		// det ls
		lm=n/nrtr;
		if(lm*nrtr<n) lm++;
		sc=0;
		for(i=0;i<lm;i++)  sc+=v[i];
		smax=sc;
		for(i=lm;i<n;i++) {
			sc=sc-v[i-lm]+v[i];
			if(smax<sc) smax=sc;
			}
		ls=smax;
		gata=0;
		//c=li;
		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>nrtr) {li=c+1;break;}
				i=j;
				}
			if(li==ls) {c=li;break;}
		  //	if(k==nrtr&&li<ls) ls--;
			if(k<=nrtr) ls=c;
			}
		}
printf("%d",c);
return 0;
}