Pagini recente » Cod sursa (job #1702079) | Cod sursa (job #2162269) | Cod sursa (job #808260) | Arhiva de probleme | Cod sursa (job #1761769)
#include<bits/stdc++.h>
using namespace std;
#define in f
#define out cout
ifstream f("transport.in");
ofstream g("transport.out");
int const inf = 1000000;
int n;
int k;
int v[16010];
int valid(int x) {
int drum = 1;
int aux = x;
for(int i = 1; i <= n; ++i) {
if(aux >= v[i]) {
aux -= v[i];
} else {
aux = x - v[i];
drum++;
}
}
if(drum <= k) {
return true;
} else {
return false;
}
}
int binsearch(int start, int fin) {
int mid = (fin + start) / 2;
while(fin - start > 1) {
mid = (fin + start) / 2;
if(valid(mid)) {
fin = mid;
} else {
start = mid;
}
}
if(valid(start)) {
return start;
} else {
return fin;
}
}
int main() {
in >> n;
in >> k;
for(int i = 1; i <= n; ++i) {
in >> v[i];
}
out << binsearch(0, inf);
}
/*
bool possible(int x)
{
int vol = 0;
int trans = 1;
bool ok = true;
for(int i=1; i<=n; i++)
{
if(v[i] > x)
{
ok = false;
break;
}
if(vol + v[i] <= x)
{
vol += v[i];
}
else
{
trans++;
vol = v[i];
}
if(trans > k )
{
ok = false;
break;
}
}
return ok;
}
int main()
{
f >> n;
f >> k;
int sum = 0;
for(int i=1; i<=n; i++)
{
f >> v[i];
sum += v[i];
}
int right = sum;
int left = 0;
while(right - left > 1)
{
int mid = (right + left) / 2;
if(possible(mid))
{
right = mid;
}
else
{
left = mid;
}
}
if(possible(left))
g << left;
else g << right;
return 0;
}
*/