Cod sursa(job #2058953)

Utilizator gruhtenZinnenberg Gruhten gruhten Data 6 noiembrie 2017 14:57:01
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <fstream>
#include <algorithm>
#define dim 101
using namespace std;

struct OM
{
    int a,b,c;
    int ord;
}PRIETEN[dim];

OM P[dim];
int N,L,ramas[dim],sol[dim],A[dim],B[dim];

bool cond(OM A, OM B)
{
    return A.c<B.c;
}


bool calcul(int t)
{
    //vedem daca ne incadram in timpul t
    int total=L,i=1;
    //rsetam timpii disponibili
    for(i=1;i<=N;++i)
        ramas[i]=t;
    i=1;
    while(total>0 and i<=N)
    {
        if(total-t/PRIETEN[i].a>=0)
        {
            total=total-t/PRIETEN[i].a;
            ramas[i]=0;
        }
        else
        {
            ramas[i]=ramas[i]-total*PRIETEN[i].a;
            total=0;
        }

        ++i;
    }
    if(total>0)
        return 0;
    else
    {
       total=L,i=N;
       while(total>0 and i>=1)
       {
            total=total-ramas[i]/PRIETEN[i].b;
            --i;
       }
      if(total>0)
        return 0;
      if(total<=0)
      {
          for(i=1;i<=N;++i)
          {
//              if(ramas[i]==0)
//                sol[i]=t/PRIETEN[i].a;
//              else
//                sol[i]=(t-ramas[i])/PRIETEN[i].a;
                sol[i]=ramas[i];
          }
          return 1;
      }

    }


}

int main()
{
    ifstream f("lapte.in");
    ofstream g("lapte.out");
    int i,j,Tmin,timp;
    int st,dr,mij,solutie;

f>>N>>L;
for(i=1;i<=N;++i)
{
    f>>PRIETEN[i].a>>PRIETEN[i].b;
    P[i]=PRIETEN[i];
    PRIETEN[i].c=PRIETEN[i].a-PRIETEN[i].b;
    PRIETEN[i].ord=i;
}

sort(PRIETEN+1,PRIETEN+N+1,cond);
/******************************************************************************/
//for(i=1;i<=N;++i)
//{
//    g<<PRIETEN[i].a<<" "<<PRIETEN[i].b<<" "<<PRIETEN[i].c<<" "<<PRIETEN[i].ord<<'\n';
//}
/******************************************************************************/

Tmin=max(PRIETEN[1].a*L,PRIETEN[N].b*L);

st=1;
dr=Tmin;
solutie=Tmin;
while(st<=dr)
{
    mij=(st+dr)/2;
    if(calcul(mij))
    {
        solutie=mij;
        dr=mij-1;
    }
    else
        st=mij+1;
}

g<<solutie<<'\n';

/******************************************************************************/
for(i=1;i<=N;++i)
{
    //g<<(solutie-sol[i])/PRIETEN[i].a<<" "<<sol[i]/PRIETEN[i].b<<" "<<PRIETEN[i].ord<<'\n';
    j=PRIETEN[i].ord;
    A[j]=(solutie-sol[i])/PRIETEN[i].a;
    B[j]=sol[i]/PRIETEN[i].b;
}
/******************************************************************************/

for(i=1;i<=N;++i)
    g<<A[i]<<" "<<B[i]<<'\n';


    return 0;
}