Pagini recente » Cod sursa (job #2149140) | Monitorul de evaluare | Cod sursa (job #2008497) | Cod sursa (job #2398564) | Cod sursa (job #591243)
Cod sursa(job #591243)
#include<stdio.h>
int N;
int A[16001];
int B[16001];
int sum;
int K;
int MAX;
int nr;
int sterge(int B[])
{
for(int i=1;i<=N;i++)
B[i] = 0;
}
int solve(int sum)
{
MAX = 0;
int nr = 1;
int a = 0;
sterge(B);
B[1] = 1;
for(int i=1;i<=N;i++)
{
if(a + A[i]<=sum)
a += A[i];
else
a = A[i],B[i] = ++nr;
if(MAX<a)
MAX = a;
}
return nr;
}
int verif(int sum)
{
int MAX = 0;
int nr = 1;
int i = 1;
int j;
int a = 0;
int b = 0;
while(nr<=K)
{
a = 0;
b = 0;
for(;B[i] != nr+1 && i<=N;i++)
a += A[i];
for(j = i;B[j] != nr+2 && j<=N;j++)
b += A[j];
while(a + A[i] <= sum && b - A[i] <= sum)
a += A[i],b-=A[i++];
while(a - A[i-1] <= sum && b + A[i-1] <=sum)
a -= A[i-1],b += A[-- i];
if(MAX<a)
MAX = a;
if(MAX<b)
MAX = b;
nr ++;
}
return MAX;
}
int main()
{
FILE *f = fopen("transport.in","r");
FILE *g = fopen("transport.out","w");
fscanf(f,"%d %d",&N,&K);
for(int i=1;i<=N;i++)
{
fscanf(f,"%d ",&A[i]);
sum += A[i];
}
sum /= K;
sum ++;
nr = solve(sum);
while(nr != K)
{
if(nr < K)
sum = sum/4*3;
else
sum *= 2;
nr = solve(sum);
}
fprintf(g,"%d",verif(MAX));
fclose(g);
fclose(f);
}