Cod sursa(job #688006)

Utilizator t.valentinoRemus Tumac t.valentino Data 22 februarie 2012 22:25:24
Problema Transport Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<cstdio>
using namespace std;
 
long long int n,k,v[16000],d=2000000000,dmax,dmin,x,verif,j,verif2;
 
bool verifk (int a)
{   int ans = 1;
	int i , s = 0;

	for (i=1;i<=n;i++){
	if (s + v[i] > a){
	s=v[i];
	ans++;
	if (ans>k) return false;
	}
	else s+=v[i];
	}
	return (ans <= k);
}
 
int main()
{
	freopen("transport.in","r",stdin);
	freopen("transport.out","w",stdout);
	scanf("%lld %lld",&n,&k);
	
	for (j=1;j<=n;j++)
		scanf("%lld",&v[j]);
	d=d/2;
	verif=verifk(d);
	if (verif==1){
		while (verif==1){
			dmax=d;
			d=d/2;
			verif=verifk(d);
			dmin=d;
		}
		verif=1;
		while (verif==1){
			d=dmin+(dmax-dmin)/2;
			verif=verifk(d);
			if (verif==1) dmax=d;
			else dmin=d;
		}
	}
	else{
		dmax=2*10^9;
		while (verif==0){
			dmin=d;
			d=dmin+(dmax-dmin)/2;
			verif=verifk(d);
			if (verif==0) dmin=d;
			else dmax=d;
		}
	}
	verif2=verifk(dmax);
	while (verif==0&&verif2==1){
		verif=verifk(dmin);
		if (verif==0) dmin++;
		verif2=verifk(dmax);
		if (verif2==1)dmax--;
	}
	printf("%lld",dmin);
	return 0;
}