Pagini recente » Cod sursa (job #2725681) | Cod sursa (job #365982) | Cod sursa (job #469038) | Cod sursa (job #3144514) | Cod sursa (job #1393245)
#include <stdio.h>
using namespace std;
FILE*f=fopen("transport.in","r"),*g=fopen("transport.out","w");
int v[16030], s = 0, n, k;
int carat(int x)
{
int s = 0, nr = k, i;
for(i = 1; i <= n; i++)
{
if(nr == 0) break;
if(s + v[i] > x)
{
s = v[i];
nr --;
}
else s += v[i];
}
if(nr > 0)
return 1;
return 0;
}
int main()
{
int maxim = 0;
fscanf(f,"%d %d\n",&n,&k);
for(int i = 1; i <= n; i++)
{
fscanf(f,"%d\n",&v[i]);
s += v[i];
if(v[i] > maxim)
maxim = v[i];
}
if(k == 1)
fprintf(g,"%d\n",s);
else if(k == n)
fprintf(g,"%d\n",maxim);
else
{
int p = maxim, u = s, mij;
while(p <= u)
{
mij = (p+u) / 2;
int sol = carat(mij);
if(sol == 1)
{
u = mij - 1;
}
else{
p = mij + 1;
}
}
fprintf(g,"%d\n",p);
}
return 0;
}