Cod sursa(job #642931)

Utilizator blue_phoenixPosea Elena blue_phoenix Data 2 decembrie 2011 16:38:26
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#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;
}