Cod sursa(job #688705)

Utilizator hcalinHrih Calin hcalin Data 23 februarie 2012 19:23:25
Problema Transport Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.81 kb
#include <cstdio>
using namespace std;


long long dr=2000000000ll,st=1,mj,sol,n,k,logic=0,a[16005],ult,i,x;

bool merge(int c){
	long long sum=0;long long transp=1;
	int i;
	for(i=1;i<=n;i++){
		if(sum+a[i]>c){
			transp++;
			sum=a[i];
			if(transp>k)
				return false;
		}
		else
			sum+=a[i];
	}
		return (transp<=k);
};


int main(){
	freopen("transport.in","r",stdin);
	freopen("transport.out","w",stdout);
	scanf("%lld",&n);
	scanf("%lld",&k);
	
	for(i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	//merge(7);
	while((st<=dr)&&(logic!=1)){
		mj=(st+dr)/2;
		if(merge(mj)!=0){
			dr=mj-1;
		if(ult==1){
				logic=1;
				sol=mj;
			}
		}
			else{
				st=mj+1;
				ult=1;
			}
	}
	if(merge(sol)!=0){
	while(merge(sol)!=0)
		sol--;
	sol++;
	}
	else{
	while(merge(sol)==0)
		sol++;
	sol--;
	}
			printf("%lld",sol);
}