Cod sursa(job #1247212)

Utilizator fhandreiAndrei Hareza fhandrei Data 22 octombrie 2014 13:14:24
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
// FMI - Grupa 135 - Semigrupa 2 - Hareza Andrei
// Include
#include <fstream>
using namespace std;

// Constante
const int sz = 16003;

// Functii
int bSearch(int left, int right);
bool valide(int size);
template<class T> int binarySearch(T *data, int left, int right, T value, bool (*comp)(T a, T b));
template<class T> int binarySearchA(T *data, int left, int right, T value, bool (*comp)(T a, T b));
bool lowerEqual(int a, int b) { return a<=b;}

// Variabile
ifstream in("transport.in");
ofstream out("transport.out");

int num, maxMoves;
int sum[sz];

// Main
int main()
{
	in >> num >> maxMoves;
	for(int i=1 ; i<=num ; ++i)
	{
		in >> sum[i];
		sum[i] += sum[i-1];
	}
	
	out << bSearch(1, sz*sz) << '\n';
	
	in.close();
	out.close();
	return 0;
}

int bSearch(int left, int right)
{
	if(left == right)
		return left;
	
	int mid = (left+right) / 2;
	
	if(valide(mid))
		return bSearch(left, mid);
	else
		return bSearch(mid+1, right);
}

bool valide(int size)
{
	int current = 0;
	int pos = 0;
	for(int i=1 ; i<=maxMoves ; ++i)
	{
		pos = binarySearch(sum, pos+1, num, current+size, lowerEqual);
		if(sum[pos] != current+size)
			--pos;
		
		if(pos == num)
			return true;
		
		current = sum[pos];
	}
	
	return false;
}

template<class T> int binarySearch(T *data, int left, int right, T value, bool (*comp)(T a, T b))
{
	int lft = data[left-1];
	int rgh = data[right+1];
	
	data[left-1] = -2147483647;
	data[right+1] = 2147483647;
	
	int ans = binarySearchA(data, left-1, right+1, value, comp);
	
	data[left-1] = lft;
	data[right+1] = rgh;
	
	return ans;
}

template<class T> int binarySearchA(T *data, int left, int right, T value, bool (*comp)(T a, T b))
{
	if(left == right)
		return left;
	
	int mid = (left+right)/2;
	
	if(comp(value, data[mid]))
		return binarySearchA(data, left, mid, value, comp);
	else
		return binarySearchA(data, mid+1, right, value, comp);
}