Cod sursa(job #1125150)

Utilizator DiClauDan Claudiu DiClau Data 26 februarie 2014 15:58:40
Problema Transport Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<stdio.h>
using namespace std;
int v[16005], k, n, maybe;
int putere(int s)
{
	int c = 0, ct = 1;
	while (ct < s)
	{
		ct <<= 1;
		c++;
	}
	return c-1;
}
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))
		return 0;
	if ((s != 0 && s < x) && nrd + 1 == k)
	{
		maybe = x;
		return 1;
	}
	if (nrd == k)
		return 2;
	return 1;
}
int cautbin( int s)
{
	int sol = 0, pas = 1 << putere(s*2);
	while (pas > 0)
	{
		if (verificare(sol+pas) == 0)
			sol += pas;
		else
			if (verificare(sol+pas) == 2)
			{
				sol += pas;
				break;
			}
		pas = pas / 2;
	}
	if (verificare(sol) == 2)
		return sol;
	else
		return maybe;
}

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;
}