Cod sursa(job #1061928)

Utilizator miu_mik93FMI - Paduraru Miruna miu_mik93 Data 20 decembrie 2013 14:38:20
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <iostream>
#include <string>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <stdarg.h>
#include <stdio.h>
using namespace std;
//#include <unordered_map>
#define NMAX 16001

int N, K, st[NMAX], nrTransp, found = (1 << 30);

int isPossible (int x)
{
	int i = 0, s = 0;
	nrTransp = 0;
	
	while ( i < N )
	{
		s = s + st[i++];
		if ( x >= s )
			continue;
		else
		{
			s -= st[--i];
			nrTransp ++;
			s = 0;
		}
		if ( nrTransp < K )
			continue;
		else
			break;
	}
	if (nrTransp <= N && i == N)
		return nrTransp;
	return -1;
}

int binarySearch (int li, int ls)
{
	int mid = ( li + ls ) / 2;
	int result = isPossible (mid);
	if ( result > 0 && found > mid)
	{
		found = mid;
	}
	if ( li < ls ) 
	{
		if ( nrTransp + 1 <= K ) 
			binarySearch (li, mid - 1);
		else 
			binarySearch (mid + 1, ls);
	}
	else
		return found;
}

int main()
{
	FILE *f = fopen ("transport.in", "r");
	FILE *g = fopen ("transport.out", "w");
	
	fscanf (f, "%d %d", &N, &K);
	int maxim = 0, s = 0;

	for (int  i = 0; i < N; i++)
	{
		fscanf (f, "%d", &st[i]);
		if ( st[i] > maxim )
			maxim = st[i];

		s = s + st[i];
	}

	fprintf (g, "%d", binarySearch ( maxim, s ));

	fclose(f);
	fclose(g);
	return 0;
}