Pagini recente » Cod sursa (job #56351) | Cod sursa (job #1258817) | Cod sursa (job #571) | Cod sursa (job #253140) | Cod sursa (job #1721078)
#include <fstream>
using namespace std;
int main()
{
int n, k, c, i, j, *stiva, s = 0, max = 0, transporturi, suma, left, right, mid;
ifstream cin ("transport.in");
ofstream cout ("transport.out");
cin >> n >> k;
stiva = new int[n + 1];
for (i = 1; i <= n; i++){
cin >> stiva[i];
s = s + stiva[i];
if (stiva[i] > max){
max = stiva[i];
}
}
if (s / k > max){
c = s / k;
}
else {
c = max;
}
left = c;
right = s;
while (left < right - 1){
mid = left + (right - left) / 2;
transporturi = 0;
j = 1;
while (1){
suma = 0;
while (j <= n && suma + stiva[j] <= mid){
suma = suma + stiva[j];
j++;
}
transporturi++;
if (transporturi == k){
right = mid;
break;
}
if (transporturi > k){
left = mid;
break;
}
if (j > n){
right = mid;
break;
}
}
}
transporturi = 0;
j = 1;
while (transporturi < k && j <= n){
suma = 0;
while (j <= n && suma + stiva[j] <= left){
suma = suma + stiva[j];
j++;
}
transporturi++;
}
if (transporturi == k && j > n){
cout << left;
}
else {
cout << right;
}
return 0;
}