Pagini recente » Cod sursa (job #2367093) | Cod sursa (job #204786) | Cod sursa (job #3000832) | Cod sursa (job #3219258) | Cod sursa (job #1430294)
#include <iostream>
#include <fstream>
#define nmax 16001
using namespace std;
ifstream f("transport.in");
ofstream g("transport.out");
int v[nmax], maxCamion, sumaMomentana, kMomentan, minCamion, limitL, limitR, sMax, ok, intMaxCamion, k1, k2;
int main()
{
int n, k;
f >> n >> k;
for (int i = 1; i <= n; i++) {
f >> v[i];
if (minCamion < v[i]) minCamion = v[i];
sMax += v[i];
}
maxCamion = (sMax + minCamion) / 2;
limitL = minCamion;
limitR = sMax;
while (1) {
for (int i = 1; i <= n; i++) {
sumaMomentana += v[i];
if (sumaMomentana > maxCamion) {
kMomentan++;
sumaMomentana = v[i];
if (i == n) kMomentan++;
}
else if (i == n) kMomentan++;
}
if (kMomentan > k) {
limitL = maxCamion;
maxCamion = (limitL + limitR) / 2;
}
if (kMomentan <= k) {
limitR = maxCamion;
maxCamion = (limitL + limitR) / 2;
}
sumaMomentana = 0;
kMomentan = 0;
if (limitL + 1 == limitR) {
for (int i = 1; i <= n; i++) {
sumaMomentana += v[i];
if (sumaMomentana > limitL) {
kMomentan++;
sumaMomentana = v[i];
if (i == n) kMomentan++;
}
else if (i == n) kMomentan++;
}
k1 = kMomentan;
sumaMomentana = 0;
kMomentan = 0;
for (int i = 1; i <= n; i++) {
sumaMomentana += v[i];
if (sumaMomentana > limitR) {
kMomentan++;
sumaMomentana = v[i];
if (i == n) kMomentan++;
}
else if (i == n) kMomentan++;
}
k2 = kMomentan;
if (k1 <= k) {
g << limitL;
return 0;
}
if (k1 > k && k2 <= k) {
g << limitR;
return 0;
}
}
sumaMomentana = 0;
kMomentan = 0;
}
return 0;
}