Cod sursa(job #179926)

Utilizator K0nTr0LBucatea Madalin Stefan K0nTr0L Data 16 aprilie 2008 14:19:20
Problema Lapte Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include<stdio.h>
#define max(a,b) ((a>=b)?a:b)
#define inf 32000
int ts[101][101],a[1001],b[1001],c[2][1001],t[101][101],i,j,n,m,k,l,p,T,s[2][1001],nr,tsol;
FILE *in,*out;

int sol(int k){
int l,p,i,j,r,x,y;
for(i=0;i-T-1;i++){
  if(k-i*a[1]<0)
   c[0][i]=-1;
  else
   c[0][i]=(k-i*a[1])/b[1];
 c[1][i]=0;
}
for(i=2;i<=n;i++){
 x=k/a[i];
 p=(1&i);r=1-p;
  for(j=0;j<=x;j++)
    for(l=0;l+j<=T;l++)
      if(c[p][l]>=0)
	if(c[r][l+j]<c[p][l]+(k-j*a[i])/b[i])
	 c[r][l+j]=c[p][l]+(k-j*a[i])/b[i],t[i][l+j]=l;
	else;
      else
       c[r][l+j]=-1;
}
if(c[1-(1&n)][T]>=T){
  for(i=1;i<=n;i++)
    for(j=0;j-T-1;j++)
     ts[i][j]=t[i][j];
 return 1;
}
return 0;
}

void readdata(){
in=fopen("lapte.in","rt");
fscanf(in,"%d%d",&n,&T);
for(i=1;i-n-1;i++)
 fscanf(in,"%d%d",&a[i],&b[i]);
fclose(in);
}

void solve(){
int p,u,ma,i,j,l;
/*ma=m=inf;
for(i=1;i-n-1;i++){
  if(a[i]<ma)
   ma=a[i],j=i;
  if(b[i]<m)
   m=b[i],l=i;
}
if(n==1)
 u=(a[1]+b[1])*T;
else{
  if(!(j-l))
   m=max(b[1],b[2]);
 u=max(ma,m)*T;
}*/
p=1;u=10000;
while(p<=u){
 m=(p+u)>>1;
  if(sol(m))
   tsol=m,u=m-1;
  else
   p=m+1;
}
m=tsol;
}

void rebuild(){
int i,j;
nr=0;
i=n;j=T;
while(i){
 s[0][i]=j-ts[i][j];
 s[1][i]=(m-s[0][i]*a[i])/b[i];
 j=ts[i][j];
 i--;
}
}

void writedata(){
int i;
out=fopen("lapte.out","wt");
fprintf(out,"%d\n",m);
for(i=1;i<=n;i++)
 fprintf(out,"%d %d\n",s[0][i],s[1][i]);
fclose(out);
}

int main(){
readdata();
solve();
rebuild();
writedata();
return 0;
}