Cod sursa(job #1022458)

Utilizator BuseSorinFMI Buse Sorin-Marian BuseSorin Data 5 noiembrie 2013 14:49:42
Problema Transport Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<iostream>
#include<fstream>
using namespace std;
int verifica(int saltele[], int n, int max, int k){
	int i = 0, l = 0;
	while (i < n){
		int c = max;

		while (saltele[i] <= c&&i<n){
			c -= saltele[i];
			i++;
		}
		l++;
		if (l>k){
			return -1;
		}
	}
	if (l < k){
		return 0;
	}

	return 1;
}
int cauta(int saltele[], int n, int k, int stanga, int dreapta){
	while (stanga <= dreapta){
		int mij = stanga + (dreapta - stanga) / 2;
		int p = verifica(saltele, n, mij, k);
		if (p == 0 || verifica(saltele, n, mij - 1, k) == 1){
			dreapta = mij -1;
		}
		else{
			if (p == -1){
				stanga = mij + 1;
			}
			else{
				return mij;
			}
		}
	}
}
int main(){
	ifstream f("transport.in");
	int n = 0, k = 0;
	f >> n >> k;
	int saltele[16000];
	int max = 0, s = 0;
	for (int i = 0; i < n; i++){
		f >> saltele[i];
		s += saltele[i];
		if (saltele[i]>max){
			max = saltele[i];
		}
	}
	ofstream o("transport.out");
	if (verifica(saltele, n, max, k) == 1){
		o << max;
	}
	else{
		o << cauta(saltele, n, k, max, s);
	}

	return 0;
}