Pagini recente » Cod sursa (job #1256203) | Cod sursa (job #496442) | Cod sursa (job #1565346) | Cod sursa (job #895790) | Cod sursa (job #591247)
Cod sursa(job #591247)
#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 C[16001];
int MAX = 0;
int nr = 1;
int i = 1;
int j;
int a = 0;
int b = 0;
for(int i=1;i<=K;i++)
C[i] = sum;
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];
if(C[nr]>a)
C[nr] = a;
if(C[nr+1] > b)
C[nr+1] = b;
while(a + A[i] <= sum && b - A[i] <= sum)
{
a += A[i],b-=A[i++];
if(C[nr] > a || C[nr + 1] > b)
C[nr] = a,C[nr+1] = b;
}
while(a - A[i-1] <= sum && b + A[i-1] <=sum)
{
a -= A[i-1],b += A[-- i];
if(C[nr] > a || C[nr + 1] > b)
C[nr] = a,C[nr+1] = b;
}
nr ++;
}
for(int i=1;i<=K;i++)
if(C[i]>MAX)
MAX = C[i];
for(int i=1;i<=K;i++)
printf("%d ",C[i]);
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);
}