Pagini recente » Cod sursa (job #1564230) | Utilizatori inregistrati la preONI 2008, Runda 1, Clasa a 10-a | Cod sursa (job #2656908) | Cod sursa (job #2466092) | Cod sursa (job #3279292)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream input("transport.in");
ofstream output("transport.out");
int N, K;
vector<int> saltele;
int gasit(int i);
int cautareBinara (int i, int j) {
int p;
while (i < j) {
if (i + 1 == j) {
int toR = gasit(j) == 1 ? j : i;
return toR;
}
p = (i + j) / 2;
int g = gasit(p);
if (g == 1)
j = p;
else
i = p;
}
return p;
}
int gasit (int i) {
int j = i;
int k = 1;
for (int o = 0; o < N; o++)
if (i >= saltele[o]) {
i -= saltele[o];
} else {
i = j;
k++;
o--;
}
if (k <= K) return 1;
return -1;
}
int main()
{
int suma = 0;
int maxim = 0;
input >> N >> K;
for (int i = 1; i <= N; i++) {
int x;
input >> x;
suma += x;
maxim = max(maxim, x);
saltele.push_back(x);
}
if (gasit(maxim) == 1)
output << maxim;
else if (gasit(suma) == 1 && gasit(suma - 1) == -1)
output << suma;
else
output << cautareBinara(maxim, suma);
return 0;
}