Cod sursa(job #338884)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 7 august 2009 12:22:57
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<iostream>
#include<string>

using namespace std;

FILE*fin=fopen("transport.in","r");
FILE*fout=fopen("transport.out","w");

#define nm 16005

int n,k,vol[nm],tc[nm];

inline int sum(int a,int b)
{
     return tc[b]-tc[a-1];
}

inline int posibil(int val)
{
     int top=n,nrt=0,b,t,mid;   
     
     while(top)
     {
       b=1;t=top;
       nrt++;
       
       if(vol[top]>val) return 0;
       
       while(b<t)
       {
         mid=(b+t)/2;
         
         if(sum(mid,top)<=val) t=mid;
         else b=mid+1;
       }
       
       top=b-1;
       
       if(nrt>k) return 0;
     }
     
     return 1;
}

int main()
{
    int i,st,dr,mij;
    
    fscanf(fin,"%d%d",&n,&k);
    
    tc[0]=0;
    
    for(i=n;i>=1;i--)
      fscanf(fin,"%d",&vol[i]);
    
    for(i=1;i<=n;i++)
      tc[i]=tc[i-1]+vol[i];
      
    st=0;dr=2000000000;
    
    while(st<dr)
    {
      mij=(st+dr)/2;
      
      if(posibil(mij)) dr=mij;
      else st=mij+1;
    }  
    
    fprintf(fout,"%d",st);
    
    fclose(fin);
    fclose(fout);
    
    return 0;
}