Pagini recente » Cod sursa (job #1563178) | Cod sursa (job #769831) | Cod sursa (job #1308548) | Istoria paginii runda/iconcurs1 | Cod sursa (job #391925)
Cod sursa(job #391925)
#include <cstdio>
#define NMAX 101
#define TMAX 101
int N,L;
struct timpi
{
int a,b;
}e[NMAX];
void citire()
{
scanf("%d %d",&N,&L);
for(int i=1;i<=N;i++)
scanf("%d %d",&e[i].a,&e[i].b);
}
void scrie(int T)
{
int lung=0,i=1,lung2;
while(lung<L)
{
lung2=lung;
lung+=T/e[i++].a;
if(lung>=L)
{
printf("%d %d\n",L-lung2,lung=(T-(L-lung2)*e[i-1].a)/e[i-1].b);
break;
}
else printf("%d %d\n",lung-lung2,0);
}
while(lung<L && i<=N)
{
lung2=lung;
lung+=T/e[i++].b;
printf("%d %d\n",0,lung-lung2);
}
}
void interclasare(int p,int m,int q)
{
int i=p,j=m+1,k=0;
timpi f[NMAX];
while(i<=m && j<=q)
if( (e[i].a<e[j].a) || (e[i].a==e[j].a && e[i].b>e[j].b) )
f[++k]=e[i++];
else
f[++k]=e[j++];
while(i<=m)
f[++k]=e[i++];
while(j<=q)
f[++k]=e[j++];
for(int l=1;l<=k;l++)
e[p-1+l]=f[l];
}
void merge_sort(int p,int q)
{
if(p<q)
{
int m=(p+q)/2;
merge_sort(p,m);
merge_sort(m+1,q);
interclasare(p,m,q);
}
}
int ok(int x)
{
int lung=0,i=1,lung2;
while(lung<L && i<=N)
{
lung2=lung;
lung+=x/e[i++].a;
}
if(lung>=L) lung=(x-(L-lung2)*e[i-1].a)/e[i-1].b;
else return 0;
while(lung<L && i<=N)
lung+=x/e[i++].b;
if(lung>=L) return 1;
return 0;
}
void cautare_bin()
{
int T=0,p=1;
while((p<<1)<=TMAX)
p<<=1;
while(p)
{
if(!ok(T+p))
T+=p;
p>>=1;
}
scrie(T+1);
}
int main()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
citire();
merge_sort(1,N);
cautare_bin();
return 0;
}