Pagini recente » Monitorul de evaluare | Istoria paginii utilizator/asgari_armin123 | Monitorul de evaluare | Diferente pentru home intre reviziile 574 si 902 | Cod sursa (job #2079551)
#include <cstdio>
using namespace std;
int v[16000];
int n;
int verif( int d ) {
int i,s,k;
s = 0;
i = 1;
k = 0;
while( i <= n ) {
while( s <= d && i <= n ) {
s = s + v[i];
i ++;
}
k ++;
if( s > d )
i --;
s = 0;
}
return k;
}
int main() {
freopen("transport.in","r",stdin);
freopen("transport.out","w",stdout);
int c,st,dr,mid,k,max,s,i;
scanf("%d%d",&n,&k);
max = s = 0;
for( i = 1; i <= n; i ++ ) {
scanf("%d",&v[i]);
if( max < v[i] )
max = v[i];
s = s + v[i];
}
st = max;
dr = s;
mid = ( dr + st ) / 2;
int min = s + 1;
while( st < dr ) {
c = verif(mid);
if( c > k )
st = mid;
else if( c < k ) {
dr = mid;
if( mid < min )
min = mid;
}
else if( c == k )
break;
mid = ( st + dr ) / 2;
}
if( min < mid )
printf("%d",min);
else
printf("%d",mid);
return 0;
}