Cod sursa(job #114075)

Utilizator piroslPiros Lucian pirosl Data 12 decembrie 2007 16:56:35
Problema Transport Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <stdio.h>
#include <stdlib.h>

int num[16001];
int n, k;
int min = 16001;

int number(int l)
{
	int res = 0;
	int s = 0;
	for(int i=0;i<n;++i) 
	{
		if(s+num[i] <= l)
		{
			s += num[i];
		}
		else
		{
			++res;
			s = num[i];
		}
	}
	if(s>0)
		res++;

	return res;
}

void process(long a, long b)
{
	if(a>b)
		return;
	long p = (a+b)/2;
	int r = number(p);
	if(r<=k)
	{
		if(p<min)
			min = p;
		process(a, p-1);
	}else
	{
		process(p+1, b);
	}
}

int main(void)
{
	FILE* fin;
	FILE* fout;

	fin = fopen("transport.in", "r");
	fout = fopen("transport.out", "w");
	
	fscanf(fin, "%d %d\n", &n, &k);
	long max = 0;
	long sum = 0;
	for(int i=0;i<n;++i)
	{
		int a;
		fscanf(fin,"%d\n", &a);
		num[i] = a;
		sum += a;
		if(a>max)
			max = a;
	}

	process(max, sum);

	fclose(fin);
	fprintf(fout, "%d\n", min);
	fclose(fout);
	return 0;
}