Pagini recente » Cod sursa (job #782605) | Cod sursa (job #1645394) | Cod sursa (job #1705619) | Cod sursa (job #2160646) | Cod sursa (job #642931)
Cod sursa(job #642931)
#include <stdio.h>
#define nmax 16040
int saltele[nmax];
int n,k;
int nr_transp(int cap_max){
int c=0;
int i=0;
int s=0;
int aux;
while(i<n){
aux=s+saltele[i];
if(aux<=cap_max){
s=aux;
i++;
}else{
//trec la urm transport
c++;
if(c>k)return c;
s=0;
}
}
if(s)return c+1;
return c;
}
int aux1,aux2;
int cauta(int li, int ls){
//printf("caut o capacitate intre %d si %d\n",li,ls);
//cauta cel mai mic indice i pt care v[i]<=k
if(li==ls)return li;
if((ls-li)==1){//
aux1=nr_transp(li);
if(aux1<=k)return li;
//aux2=nr_transp(ls);
return ls;
}
//daca am de ales intre cel putin trei capacitati
int mij=li+(ls-li)/2;
aux1=nr_transp(mij);
aux2=nr_transp(mij-1);
if(aux2>k){
if(aux1<=k){
return mij;
}else return cauta(mij+1,ls);
}return cauta(li,mij-1);
}
int main(){
FILE *fin=fopen("transport.in","r");
FILE *fout=fopen("transport.out","w");
fscanf(fin,"%d%d",&n,&k);
int i;
int max=-1;
int suma=0;
for(i=0;i<n;i++){
fscanf(fin,"%d",&saltele[i]);
if(max<saltele[i])max=saltele[i];
suma+=saltele[i];
}
fprintf(fout,"%d\n",cauta(max,suma));
return 0;
}