Cod sursa(job #403340)

Utilizator zalmanDanci Emanuel Sebastian zalman Data 24 februarie 2010 21:04:08
Problema Transport Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <iostream>
#include <cstdio>
#define NMAX 100
using namespace std;

int N, K, v[NMAX];
int i, mij, sol, sum, maxx;

void iFu(void)
{
	FILE *f = fopen("transport.in", "r");
	fscanf(f, "%d%d", &N, &K);
	for(i = 1; i <= N; ++i)
	{
		fscanf(f, "%d", &v[i]);
		sum += v[i];
		if(v[i] > maxx)
			maxx = v[i];
	}
	fclose(f);
}
bool calc(int total)
{
	int tmp = 0, nrc = 0;
	for(i = 1; i <= N; ++i)
	{
		if(tmp + v[i] <= total)
			tmp += v[i];
		else
		{
			tmp = v[i];
			nrc++;
		}
	}
	if(tmp == v[N])
		++nrc;
	if(nrc > K)
		return 0;
	if(nrc <= K)
		return 1;
	
}
void solve(void)
{
	int ls = maxx, ld = sum, m;
	while(ls <= ld)
	{
		m = (ls+ld)/2;
		int t = calc(m);
		if(t)
			ld = m - 1, sol = m;
		else
			ls = m + 1;
	}
}
void oFu(void)
{
	FILE *g = fopen("transport.out", "w");
	fprintf(g, "%d", sol);
	fclose(g);
}
int main(void)
{
	iFu();
	solve();
	oFu();
	
	return 0;
}