Pagini recente » Cod sursa (job #3182121) | Cod sursa (job #1783570) | Cod sursa (job #2233482) | Cod sursa (job #896795) | Cod sursa (job #1798732)
#include <iostream>
#include <fstream>
#define DIMMAX 16005
#define ll long long
#define FOR(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int N, C, K, s[DIMMAX], maxim=-1;
ll Maxim;
void citire()
{
ifstream f("transport.in");
f>>N>>K;
FOR(i,1,N)
{
f>>s[i];
Maxim+=s[i];
if(s[i] > maxim)
maxim=s[i];
}
f.close();
}
void afisare()
{
ofstream g("transport.out");
g<<C;
g.close();
}
ll calcul_nr_trans(int x)
{
ll sum=0,tr=0;
FOR(i,1,N)
{
sum+=s[i];
if(sum>x)
{
sum=s[i];
tr++;
}
else
if(sum==x)
{
sum=0;
tr++;
}
}
if(sum)tr++;
if(!tr)return 1;
return tr;
}
int cautareBinara(ll s, ll d)
{
if(s<d)
{
ll m=(s+d)/2;
ll x=calcul_nr_trans(m);
if(x==K)return m;
else
if(x<K)
cautareBinara(s, m-1);
else
cautareBinara(m+1, d);
}
else return -1;
}
int main()
{
citire();
if(K==1)
{
C=Maxim;
afisare();
return 0;
}
C=cautareBinara(maxim, Maxim);
if(C==-1)
{
C=1;
afisare();
return 0;
}
int ok=1;
while(ok)
{
if(calcul_nr_trans(C-1)==K)C--;
else ok=0;
}
if(C<maxim)C=maxim;
afisare();
return 0;
}