Cod sursa(job #1123253)

Utilizator DiClauDan Claudiu DiClau Data 25 februarie 2014 23:53:35
Problema Transport Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include<stdio.h>
using namespace std;
int v[16005], k, n;
int verificare (int x)
{
	int s = 0, i, nrd = 0;
	for (i = 1; i <= n; i++)
	{
		s += v[i];
		if (s > x)
		{
			if (v[i] > x)
				return 0;
			s = 0;
			i--;
			nrd++;
		}
		if (s == x)
		{
			s = 0;
			nrd++;
		}
		if (nrd > k)
			return 0;
	}
	if (s != 0 && s < x && (nrd + 1 > k  || nrd + 1 == k))
		return 0;
	return 1;
}
int cautbin( int s)
{
	int sol = 0, pas = s;
	while (pas > 0)
	{
		if (verificare(sol+pas) == 0)
			sol += pas;
		pas = pas / 2;
	}
	return sol;
}

int main ()
{
	FILE *in,*out;
	in = fopen ("transport.in","r");
	out = fopen ("transport.out","w");
	fscanf (in, "%d%d", &n, &k);
	int s = 0, i;
	for (i = 1; i <= n; i++)
	{
		fscanf (in, "%d", &v[i]);
		s += v[i];
	}
	s = s / 2;
	int sol;
	sol = cautbin (s);
	fprintf (out, "%d", sol);
	return 0;
}