Pagini recente » Cod sursa (job #1119875) | Cod sursa (job #2722962) | Cod sursa (job #584456) | Cod sursa (job #3280490) | Cod sursa (job #1408311)
#include <cstdio>
using namespace std;
const int nmax=16000;
int saltele[nmax+1];
int n,k;
bool ok(int smax){
int i;
int s=0;
int transporturi=0;
for (i=1;i<=n;++i){
if (saltele[i]>smax){
return false;
}
if (s+saltele[i]>smax){
s=0;
++transporturi;
}
s+=saltele[i];
}
if (s>0){
++transporturi;
}
return transporturi<=k;
}
int main()
{
/*Deschid fisierele*/
freopen("transport.in","r",stdin);
freopen("transport.out","w",stdout);
/* Variabile */
int i;
int s=0;
/*Input*/
scanf("%d%d",&n,&k);
if (n==k){
int maxim=-1;
for (i=1;i<=n;++i){
scanf("%d",&saltele[i]);
if (saltele[i]>maxim){
maxim=saltele[i];
}
}
printf("%d",maxim);
return 0;
}
for (i=1;i<=n;++i){
scanf("%d",&saltele[i]);
s+=saltele[i];
}
/*Binary Search prin toate sumele maxime*/
int st=1;
int dr=s;
int med,last=-1;
while (st<=dr){
med=(st+dr)>>1;
//Daca suma este buna sau prea mare, incerc una mai mica. Daca nu, incerc una mai mare
if (ok(med)){
last=med;
dr=med-1;
}
else{
st=med+1;
}
}
printf("%d",last);
return 0;
}