Cod sursa(job #3256018)

Utilizator RaraselzPetre Rares Mihail Raraselz Data 12 noiembrie 2024 22:56:59
Problema Transport Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("transport.in");
ofstream fout("transport.out");

bool canFormSums(const vector<int>& arr, int k, int q, int target) {
	int currentSum = 0, parts = 1;

	for (int i = 0; i < k; i++) {
		if (arr[i] > target) return false;
		
		if (currentSum + arr[i] > target) {
			parts++;
			currentSum = arr[i]; 
			
			if (parts > q) return false;
		}
		else {
			currentSum += arr[i];
		}
	}
	return true;
}

int findMinimumLargestSum(const vector<int>& arr, int k, int q) {
	int left = *max_element(arr.begin(), arr.end());
	int right = accumulate(arr.begin(), arr.end(), 0);
	int answer = right;
	
	while (left <= right) {
		int mid = left + (right - left) / 2;
		
		if (canFormSums(arr, k, q, mid)) {
			answer = mid; 
			right = mid - 1;
		} else {
			left = mid + 1;
		}
	}
	return answer;
}
int main() {
	
	int len, q;
	fin >> len >> q;
	vector<int> arr(len);
	
	for (int i = 0; i < len; i++) {
		fin >> arr[i];
	}
		
	fout << findMinimumLargestSum(arr, len, q);
	
	
	return 0; 
}