Cod sursa(job #197935)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 7 iulie 2008 12:32:08
Problema Lapte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include<stdio.h>
long t[101],c[101],ta[101],tb[101],ca[101],cb[101],sa[101],sb[101],l,i,n,iu;
void swap(long i1,long i2);
int main()
{
	freopen("lapte.in","rt",stdin);
	freopen("lapte.out","wt",stdout);
	scanf("%ld%ld",&n,&l);
	for(i=1;i<=n;i++) { scanf("%d%d",&ta[i],&tb[i]);c[i]=i;}
	ca[1]=l;cb[1]=l;t[1]=l*(ta[1]+tb[1]);
	iu=1;
	while(iu)
	{ iu=0;
	  if(ca[1])
	  {  for(i=2;i<=n;i++)
	      if(t[i]+ta[i]<t[1])iu=i;
	  }
	  if(iu)
	  { ca[1]--;
	    ca[iu]++;
	    t[1]-=ta[1];
	    t[iu]+=ta[iu];
	    if(t[iu]>t[1])swap(1,iu);
	    while(iu<n&&t[iu]<t[iu+1]){swap(iu,iu+1);iu++;}
	    while(t[iu]>t[iu-1]){swap(iu,iu-1);iu--;}
	    iu=1;
	    while(t[iu]<t[iu+1]){swap(iu,iu+1);iu++;}
	    continue;
	 }
	 if(cb[1])
	  {  for(i=2;i<=n;i++)
	      if(t[i]+tb[i]<t[1])iu=i;
	  }
	  if(iu)
	  { cb[1]--;
	    cb[iu]++;
	    t[1]-=tb[1];
	    t[iu]+=tb[iu];
	    if(t[iu]>t[1])swap(1,iu);
	    while(iu<n&&t[iu]<t[iu+1]){swap(iu,iu+1);iu++;}
	    while(t[iu]>t[iu-1]){swap(iu,iu-1);iu--;}
	    iu=1;
	    while(t[iu]<t[iu+1]){swap(iu,iu+1);iu++;}
	  }
	 }
	printf("%ld\n",t[1]);
	for(i=1;i<=n;i++){sa[c[i]]=ca[i];sb[c[i]]=cb[i];}
	for(i=1;i<=n;i++)printf("%ld %ld\n",sa[i],sb[i]);
	return 0;
}
void swap(long i1,long i2)
{
	long
	aux=c[i1];c[i1]=c[i2];c[i2]=aux;
	aux=t[i1];t[i1]=t[i2];t[i2]=aux;
	aux=ta[i1];ta[i1]=ta[i2];ta[i2]=aux;
	aux=tb[i1];tb[i1]=tb[i2];tb[i2]=aux;
	aux=ca[i1];ca[i1]=ca[i2];ca[i2]=aux;
	aux=cb[i1];cb[i1]=cb[i2];cb[i2]=aux;
}