Cod sursa(job #591247)

Utilizator maritimCristian Lambru maritim Data 23 mai 2011 14:49:09
Problema Transport Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<stdio.h>

int N;
int A[16001];
int B[16001];
int sum;
int K;
int MAX;
int nr;

int sterge(int B[])
{
	for(int i=1;i<=N;i++)
		B[i] = 0;
}

int solve(int sum)
{
	MAX = 0;
	int nr = 1;
	int a = 0;
	sterge(B);
	B[1] = 1;
	for(int i=1;i<=N;i++)
	{
		if(a + A[i]<=sum)
			a += A[i];
		else
			a = A[i],B[i] = ++nr;
		if(MAX<a)
			MAX = a;
	}
	return nr;
}

int verif(int sum)
{
	int C[16001];
	int MAX = 0;
	int nr = 1;
	int i = 1;
	int j;
	int a = 0;
	int b = 0;
	for(int i=1;i<=K;i++)
		C[i] = sum;
	while(nr<K)
	{
		a = 0;
		b = 0;
		for(;B[i] != nr+1 && i<=N;i++)
			a += A[i];
		for(j = i;B[j] != nr+2 && j<=N;j++)
			b += A[j];
		if(C[nr]>a)
			C[nr] = a;
		if(C[nr+1] > b)
			C[nr+1] = b;
		while(a + A[i] <= sum && b - A[i] <= sum)
		{
			a += A[i],b-=A[i++];
			if(C[nr] > a || C[nr + 1] > b)
				C[nr] = a,C[nr+1] = b;
		}
		while(a - A[i-1] <= sum && b + A[i-1] <=sum)
		{
			a -= A[i-1],b += A[-- i];
			if(C[nr] > a || C[nr + 1] > b)
				C[nr] = a,C[nr+1] = b;
		}
		nr ++;
	}
	for(int i=1;i<=K;i++)
		if(C[i]>MAX)
			MAX = C[i];
	for(int i=1;i<=K;i++)
		printf("%d ",C[i]);
	return MAX;
}

int main()
{
	FILE *f = fopen("transport.in","r");
	FILE *g = fopen("transport.out","w");
	
	fscanf(f,"%d %d",&N,&K);
	for(int i=1;i<=N;i++)
	{
		fscanf(f,"%d ",&A[i]);
		sum += A[i];
	}
	sum /= K;
	sum ++;
	nr = solve(sum);
	while(nr != K)
	{
		if(nr < K)
			sum = sum/4*3;
		else
			sum *= 2;
		nr = solve(sum);
	}
	fprintf(g,"%d",verif(MAX));
	
	fclose(g);
	fclose(f);
}