Pagini recente » Cod sursa (job #350538) | Cod sursa (job #105453) | Cod sursa (job #85082) | Cod sursa (job #2362460) | Cod sursa (job #2750959)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
int n,k,salt,sum,gas,p,ant2,k2,max1,min_min;
vector<int> v,suma;
bool inceput=true;
int caut_binara(int st,int dr,int num,int ant)
{
int mij=(st+dr+1)/2;
if(ant!=mij)
{
if(num==suma[mij]-gas)
{
return mij;
}
else if(num<suma[mij]-gas)
{
caut_binara(st,mij,num,mij);
}
else if(suma[mij]-gas<num)
{
caut_binara(mij,dr,num,mij);
}
}
else
{
return mij;
}
}
void af(int pos)
{
int pos2=pos;
k2=1;
gas=suma[pos];
max1=suma[pos];
while(pos2<n && k2<k)
{
pos2=caut_binara(pos2+1,n-1,suma[pos2],-1);
if(pos2<n)
{
int dif1=abs(suma[pos2]-suma[pos]-max1),dif2=abs(suma[pos2+1]-suma[pos]-max1);
if(dif1<dif2)
{
k2++;
max1=max(max1,suma[pos2]-suma[pos]);
pos=pos2;
}
else
{
max1=max(max1,suma[pos2+1]-suma[pos]);
pos2++;
pos=pos2;
k2++;
}
gas=max1;
}
}
}
int main()
{
ifstream fin("transport.in");
ofstream fout("transport.out");
fin>>n>>k;
for(int i=0;i<n;i++)
{
fin>>salt;
v.push_back(salt);
sum+=salt;
suma.push_back(sum);
}
for(int i=0;i<n;i++)
{
af(i);
if(inceput==true)
{
min_min=max1;
inceput=false;
}
else
{
min_min=min(min_min,max1);
}
}
fout<<min_min;
}