Cod sursa(job #1792275)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 30 octombrie 2016 11:48:21
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>
#include <cstring>
#define MAXL 100
int dp[MAXL+1][2*MAXL+1],next[MAXL+1][2*MAXL+1];
int ta[MAXL+1],tb[MAXL+1];
int ansa[MAXL+1],ansb[MAXL+1];
inline int getmax(int a,int b){
    if(a<b) return b;
    return a;
}
inline char cauta(int t,int n,int l){
    int i,ans,j,k;
    memset(dp,-1,sizeof(dp));
    dp[0][0]=0;
    for(i=1;i<=n;i++)
     for(j=0;j<=2*l;j++)
        for(k=0;k<=j&&t-k*ta[i]>=0;k++)
          if(dp[i-1][j-k]>=0&&dp[i][j]<dp[i-1][j-k]+(t-k*ta[i])/tb[i]){
             dp[i][j]=dp[i-1][j-k]+(t-k*ta[i])/tb[i];
             next[i][j]=j-k;
          }
    ans=0;
    for(i=l;i<=2*l;i++)
      if(dp[n][i]>=l)
        ans=i;
    return ans;
}
FILE*fi,*fout;
void print(int l,int c,int t){
    if(l==0)
      return ;
    ansa[l]=c-next[l][c];
    ansb[l]=(t-ansa[l]*ta[l])/tb[l];
    print(l-1,next[l][c],t);
}
int main(){
   int i,n,l,c,rez,pas;
   fi=fopen("lapte.in" ,"r");
   fout=fopen("lapte.out" ,"w");
   fscanf(fi,"%d %d " ,&n,&l);
   for(i=1;i<=n;i++)
     fscanf(fi,"%d %d " ,&ta[i],&tb[i]);
   rez=0;
   for(pas=1<<8;pas;pas>>=1)
     if(cauta(rez+pas,n,l)==0)
       rez+=pas;
   rez++;
   c=cauta(rez,n,l);
   fprintf(fout,"%d\n" ,rez);
   print(n,c,rez);
   for(i=1;i<=n;i++)
     fprintf(fout,"%d %d\n" ,ansa[i],ansb[i]);
   fclose(fi);
   fclose(fout);
   return 0;
}