Cod sursa(job #195879)

Utilizator coderninuHasna Robert coderninu Data 22 iunie 2008 22:47:49
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 kb
#include <stdio.h>
#define Nmax 16001

int N, K, i, c[Nmax], st, dr;

inline int max(int x, int y) { return x > y ? x : y; }
int search(int,int);
int ok(int);

int main()
{
	for(freopen("transport.in", "r", stdin), scanf("%d %d", &N, &K), i = 1; i<=N; ++i) { scanf("%d\n", c+i); dr+=c[i]; st = max(st,c[i]); }
	fprintf(fopen("transport.out", "w"), "%d", search(st,dr));
	return 0;
}

int search(int st, int dr)
{
	if (st == dr) return st;
	if (st + 1 == dr)
	{
		if (ok(st)) return st;
		return dr;
	}
	int m = (st + dr) >> 1;
	if (ok(m))
		return search(st,m);
	else
		return search(m,dr);
}

int ok(int C)
{
	int nr = 1, temp = 0;
	for (i = 1; i<=N; ++i)
	{
		if (c[i] > C) return 0;
		if (temp + c[i] <= C)
		{
			temp+=c[i];		
		}
		else
		{
			nr++;
			temp = c[i];
		}
		if (nr > K) return 0;
	}
	return 1;
}