Pagini recente » Cod sursa (job #2484867) | Cod sursa (job #2523269) | Cod sursa (job #898941) | Cod sursa (job #2905724) | Cod sursa (job #798252)
Cod sursa(job #798252)
#include <iostream>
#include <fstream>
#include <vector>
std::ifstream input("transport.in");
std::ofstream output("transport.out");
bool check(long long value, int max, std::vector<int>& base);
long long binary (long long left, long long right, std::vector<int>& base, int max) {
if (left >= right)
return right;
long long m = (left + right) / 2;
if (check(m, max, base))
return binary(left, m, base, max);
else
return binary(m + 1, right, base, max);
}
bool check(long long value, int max, std::vector<int>& base) {
long long current = value;
for (size_t i = 0; i < base.size(); i++) {
if (current >= base[i]) {
current -= base[i];
} else {
max--;
current = value;
if (current >= base[i])
current -= base[i];
else
return false;
}
}
if (current != value)
max--;
if (max < 0)
return false;
std::cout << "OK: " << value << ": " << max << "\n";
return true;
}
int main() {
int n, k;
input >> n >> k;
std::vector<int>* base = new std::vector<int>();
long long sum = 0;
long max = 0;
for (int i = 0; i < n; i++) {
int value;
input >> value;
base->push_back(value);
// partial sums
sum += value;
if (max < (*base)[i])
max = (*base)[i];
}
output << binary(max, sum, *base, k);
}