Pagini recente » Cod sursa (job #1486950) | Cod sursa (job #2417329) | Cod sursa (job #2213459) | Cod sursa (job #3154190) | Cod sursa (job #1021476)
#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 0;
}
else if (l>k){
return -1;
}
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){
dreapta = mij - 1;
}
else{
if (p == -1){
stanga = mij + 1;
}
else{
if (verifica(saltele, n, mij - 1, k) == 1)
dreapta = 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;
}