Cod sursa(job #333993)

Utilizator points_hunterAdrian Dobrescu points_hunter Data 24 iulie 2009 21:28:35
Problema Lapte Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.73 kb
#include<stdio.h>

int n,L,sa,sb,a[101][2],b[101][2],sol[101],poz[101];

void init_b(int t){
  int i;  
  sa=sb=0;
  for(i=1;i<=n;i++){
    b[i][1]=t/a[i][1];
    b[i][0]=(t-b[i][1]*a[i][1])/a[i][0];
    sa+=b[i][0];
    sb+=b[i][1];
  }
}

void actualizeaza_sol(){
  int i;  
  for(i=1;i<=n;i++)
    sol[i]=b[i][0];
}

int dinamic(int t){
  int i;
  init_b(t);
  if(sb<L)
    return 0;
  i=n;
  while(sb>=L){
    if(sa>=L){
      actualizeaza_sol();
      return 1;
    }
    if(!b[i][1])
      i--;
    b[i][1]--;
    sb--;
    sa-=b[i][0];
    b[i][0]=(t-b[i][1]*a[i][1])/a[i][0];
    sa+=b[i][0];
  }
  return 0;
}

int bsearch(int li,int ls){
  int x;
  if(li>ls)
    return li;
  x=dinamic((li+ls)/2);
  if(x)
    return bsearch(li,(li+ls)/2-1);
  else
    return bsearch((li+ls)/2+1,ls);
}

void init_poz(){
  int i;
  for(i=1;i<=n;i++)
    poz[i]=i;
}

void swap(int i, int j){
  int aux;
  aux=a[i][1];
  a[i][1]=a[j][1];
  a[j][1]=aux;
  aux=a[i][0];
  a[i][0]=a[j][0];
  a[j][0]=aux;
  poz[i]=j;
  poz[j]=i;
}

void sort(){
  int i,j;
  for(i=1;i<n;i++)
    for(j=i+1;j<=n;j++)
      if(a[i][1]>a[j][1]|| (a[i][1]==a[j][1] && a[i][0]<a[j][0]))
        swap(i,j);
}

void read(){
  int i;
  scanf("%d%d",&n,&L);
  for(i=1;i<=n;i++)
    scanf("%d%d",&a[i][0],&a[i][1]);
}

void swap_poz(int i, int j){
  int aux;
  aux=sol[i];
  sol[i]=sol[j];
  sol[j]=aux;
  swap(i,j);
}

void sort_poz(){
  int i,j;
  for(i=1;i<n;i++)
    for(j=i+1;j<=n;j++)
      if(poz[i]>poz[j])
        swap_poz(i,j);
}

int main(){
  freopen("lapte.in","r",stdin);
  freopen("lapte.out","w",stdout);
  read();
  init_poz();
  sort();
  int i,x;
  printf("%d\n",x=bsearch(1,100));
  sort_poz();
  for(i=1;i<=n;i++)
    printf("%d %d\n",sol[i],(x-sol[i]*a[i][0])/a[i][1]);
  return 0;
}