Cod sursa(job #521416)

Utilizator popacamilpopa camil popacamil Data 12 ianuarie 2011 14:37:30
Problema Transport Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int n,k,i,maxim,st,dr,mij,sol;
long long int s;
int f(int x,vector<int>v){
	int y=0;
	long long int sx=0;
	for(i=1;i<=n;++i){
		if(sx+v[i]<x){
			sx+=v[i];
		}
		else{
			if(sx+v[i]==x){
				sx=0;
				++y;
			}
			if(sx+v[i]>x){
				sx=v[i];
				++y;
			}
			if(i==n && sx<x){
				++y;break;
			}
		}
	}
	return y;
}
int main(){
	freopen("transport.in","r",stdin);
	freopen("transport.out","w",stdout);
	scanf("%d%d",&n,&k);
	vector<int>v(n+2);
	for(i=1;i<=n;++i){
		scanf("%d",&v[i]);
		if(maxim<v[i]){
			maxim=v[i];
		}
		s+=v[i];
	}
	st=maxim;
	dr=s;
	if(f(st,v)<=k){
		printf("%d",st);
	}
	else{
		while(st<=dr){
			mij=(st+dr)/2;
			if(f(mij,v)<=k){
				sol=mij;
				dr=mij-1;
			}
			else{
				st=mij+1;
			}
		}
	printf("%d",sol);
	}
	
	return 0;
}