Pagini recente » Cod sursa (job #597908) | Cod sursa (job #1698589) | Cod sursa (job #365288) | Cod sursa (job #2444970) | Cod sursa (job #1022458)
#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;
}