Cod sursa(job #365252)

Utilizator Cristi09Cristi Cristi09 Data 18 noiembrie 2009 11:36:06
Problema Transport Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include<stdio.h>
//#include<conio.h>
int n,k,max,var;
long a[16000],suma=0;
int main()
{ //clrscr();
  FILE*f=fopen("transport.in","r");
  fscanf(f,"%d%d",&n,&k);
  int i=0;

  for(i,max=0;i<n;++i)
  {
	 fscanf(f,"%d",&var);
	 if(var>max)max=var;
	 if(i)a[i]=a[i-1]+var;
	 else a[i]=var;
  }
  fclose(f);
  var=a[n-1]/k;

  if(var<max)var=max;

  int ok=1,ind=-1,pred=-1,nrTrans=0,A=0,B=n,C,lo;

  while(ok)
  {  suma=var+1;

	 if(nrTrans==k-1&&a[n-1]-a[pred]<=var)ind=n;
	 else if(nrTrans==k-1)suma=var+1;

	 A=ind;lo=0;B=n;

	 while(suma>var&&!lo)
	 {
		C=(A+B)/2;
		suma=a[C];
		if(nrTrans)suma-=a[pred];
		ind=C;
		if(suma>var)
		B=C-1;
		else
		{lo=1;
		while(suma<=var&&ind<n)
		{
		   ++ind;
		   if(ind==n)continue;
		   suma=a[ind];
		   if(nrTrans)suma-=a[pred];
		}
		}
	 }
	 if(ind==n){ok=0;continue;}

	 --ind;
	 pred=ind;
	 ++nrTrans;

	 if(nrTrans==k)
		{++var;nrTrans=0;ind=pred=-1;}
  }
  FILE*g=fopen("transport.out","w");
  fprintf(g,"%d\n",var);
  fclose(g);
  return 0;
}