Cod sursa(job #2070992)

Utilizator gundorfMoldovan George gundorf Data 20 noiembrie 2017 07:36:06
Problema Transport Scor 40
Compilator c Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <stdio.h>
#include <stdlib.h>
#define Nmax 16003

int Calculare_transporturi(int s,int n,int v[])
{
    int i,transporturi=1,suma=0;

    for (i=1;i<=n;i++)
        {if (suma+v[i]<=s) suma+=v[i];
    else {suma=v[i];transporturi++;}
        }
    return transporturi;
}



int Cautare_Binara_Solutie(int i,int j,int k,int n,int v[])
{
    int mij,s=i,d=j;
    while (s<=d)
    {
        mij=(s+d)/2;
        int p=Calculare_transporturi(mij,n,v);
        if (p==k) return mij;
        else if (k<p) s=mij+1;
        else if (k>p) d=mij-1;
    }
    return -1;
}

int main()
{int n=0,v[Nmax],k,i,s=0,pas;

    FILE *f=fopen("transport.in","r");
    fscanf(f,"%d %d",&n,&k);

    for (i=1;i<=n;i++)
    {fscanf (f,"%d",&v[i]);
    s+=v[i];}

    fclose(f);

    FILE *g=fopen("transport.out","w");


   int p=Cautare_Binara_Solutie (1,s+1,k,n,v);
   pas=p/2;
   while (pas>=1)
   {while (Calculare_transporturi(p-pas,n,v)==k) p--;
    pas/=2;
   }
   fprintf(g,"%d",p);
   fclose(g);


    return 0;
}