Pagini recente » Cod sursa (job #1499547) | Cod sursa (job #39366) | Cod sursa (job #1906285) | Cod sursa (job #1469711) | Cod sursa (job #483786)
Cod sursa(job #483786)
//www.infoarena.ro/problema/transport
//incercare de O(n log n)
#include<iostream>
#include<fstream>
#define nmax 16005
using namespace std;
const char iname[] = "transport.in";
const char oname[] = "transport.out";
ifstream fin(iname);
ofstream fout(oname);
int vol[nmax], N, K, i, sol, left1, right1, middle;
bool access1;
inline bool test(int val)
{
int ct = 0;
int sum = 0;
for(int i = 1; i <= N; i ++)
{
sum = sum + vol[i];
if(sum > val && i == 1)
return true;
if(sum == val)
{
sum = 0; //am gasit un transport
ct ++;
}
if(sum > val)
{
i --;
sum = 0;
ct ++;
}
}
if(sum)
ct ++;
if(ct > K) //mai mult de K transporturi
return true;
return false;
}
void solve()
{
left1 = 0, right1 = nmax;
while(left1 < right1)
{
middle = (left1 + right1) >> 1;
access1 = test(middle);
if(access1 == 0)
right1 = middle;
else
left1 = middle + 1;
}
}
int main()
{
fin >> N >> K;
for(i = 1; i <= N; i ++)
fin >> vol[i];
solve();
fout << left1;
return 0;
}