Cod sursa(job #777523)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 12 august 2012 16:47:02
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include<fstream>
using namespace std;
typedef struct q{int x,y;}tip;
int sol[101][101],dr[101][101],ta[101],tb[101],n,l;
tip rez[101];
int maxim(int a, int b){if (a>b) return(a); else return(b);}

bool ok(int time){
     int i,j,k,la,lb;
       for(i=0; i<=n; ++i)
         for(j=1; j<=l; ++j){ sol[i][j]=-1; dr[i][j]=0; }
       for(i=0; i<=n; ++i) {sol[i][0]=0, dr[i][0]=0; } 
       
       for(i=1; i<=n; ++i)//i-au fiecare concurent
         for(j=0; j<=l; ++j)//pentru fiecare cantitate de lapte de tipul A
           for(k=0; k<=time/ta[i] && k<=j; ++k){//incerc sa continuu fiecare rezultat anterior
             if (sol[i-1][j-k]<0) continue;
              la=k*ta[i];//timpul pentru a avea k litri de tipul A;
              lb=(time-la)/tb[i];//cati litri de tipul B poate sa bea al-i-lea concurent
              if (sol[i][j]<sol[i-1][j-k]+lb){
                   sol[i][j]=sol[i-1][j-k]+lb;
                    dr[i][j]=k;
                    }
                   }
         if (sol[n][l]>=l){
                          j=l;
                           for(int i=n; i>=1; --i){
                                     rez[i].x=dr[i][j];
                                      rez[i].y = (time-rez[i].x*ta[i])/tb[i];
                                     j-=rez[i].x;
                                     }
                            return 1;
                          }
                else return 0;
}

int cauta(int left,int right){
    int mid;
    while (left<=right) {
          mid=(left+right)/2;
          if (ok(mid)) right=mid-1; else left=mid+1;
          }
    return(left);
}
int main(void){
    ifstream fin("lapte.in");
    ofstream fout("lapte.out");
    int i,max=0;
    fin>>n>>l;
    for (i=1; i<=n; ++i){fin>>ta[i]>>tb[i]; if (ta[i]>max) max=ta[i]; else if (tb[i]>max) max=tb[i];}
    fout<<cauta(1,max*l)<<"\n";
    for (i=1; i<=n; ++i) fout<<rez[i].x<<" "<<rez[i].y<<"\n";
  return(0);
}