Pagini recente » Cod sursa (job #1837575) | Cod sursa (job #2131104) | Istoria paginii runda/iconcurs23/clasament | Cod sursa (job #1237421) | Cod sursa (job #1797648)
#include <stdio.h>
#include <limits.h>
#define MAXN 16001
int v[MAXN];
int check(int x , int n , int k){
int k1 = 1 , i , x1 = x;
for(i = 1;i <= n; ++i){
if(x1 - v[i] >= 0)
x1 = x1 - v[i];
else
{
++k1;
x1 = x - v[i];
}
if(x1 == 0){
++k1;
x1 = x;
}
}
if(k1 <= k)
return 1;
return 0;
}
int main()
{
int i , k , n , sum = 0 , left , right , x , min = INT_MAX , max = 0;
FILE *f,*g;
f=fopen("transport.in","r");
g=fopen("transport.out","w+");
fscanf(f,"%d %d",&n,&k);
for(i = 1;i <= n; ++i){
fscanf(f,"%d",&v[i]);
sum = sum + v[i];
if(v[i] > max)
max = v[i];
}
left = max;
right = sum;
while(left < right){
x = (left + right) / 2;
if(check(x , n , k)){
min = x;
if(check(x - 1, n , k) == 1)
min = x - 1;
right = x - 1;
}
else{
left = x + 1;
if(check(left , n , k) == 1 && left < min)
min = left;
}
}
if(n == 1)
fprintf(g,"%d",max);
else
if(k == 1)
fprintf(g,"%d",sum);
else
fprintf(g,"%d",min);
}