Cod sursa(job #137203)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 17 februarie 2008 10:14:44
Problema Garaj Scor 30
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasa a 9-a Marime 1.24 kb
#include<stdio.h>
FILE*fin=fopen("garaj.in","r");
FILE*fout=fopen("garaj.out","w");
#define maxn 100001
int c[maxn],s[maxn],t[maxn],n,m,tmin;
void rech(int nod,int dim)
{
  int nd=nod,min=s[nod],st,dr,aux;
  st=nod<<1;dr=st+1;
  if(s[st]<min&&st<=dim){min=s[st];nd=st;}
  if(s[dr]<min&&dr<=dim){min=s[dr];nd=dr;}
  if(nd!=nod)
  {
    aux=s[nod];
    s[nod]=s[nd];
    s[nd]=aux;
    rech(nd,dim);
  }
}
void ord()
{
  int i,aux,dim;
  for(i=n/2;i>=1;i--)
    rech(i,n);
  dim=n;
  while(dim>1)
  {
    aux=s[dim];
    s[dim]=s[1];
    s[1]=aux;
    dim--;
    rech(1,dim);
  }
}
int posibil(int k)
{
  int ns=0,i,nd;
  for(i=1;i<=n;i++)
  {
    nd=k/t[i];
    ns+=(nd/2*c[i]);
    if(ns>=m) return 1;
  }
  return 0;
}
int cb()
{
  int ts=1,td=1000,tmij;
  while(ts<td)
  {
    tmij=(ts+td)/2;
    if(posibil(tmij)) td=tmij;
    else ts=tmij+1;
  }
  return ts;
}
int main()
{
  int i,ns;
  fscanf(fin,"%d%d",&n,&m);
  for(i=1;i<=n;i++)
    fscanf(fin,"%d%d",&c[i],&t[i]);
  fclose(fin);
  tmin=cb();
  for(i=1;i<=n;i++)
    s[i]=(tmin/t[i])/2*c[i];
  ord();
  ns=0;
  for(i=1;i<=n;i++)
  {
    ns+=s[i];
    if(ns>=m) break;
  }
  fprintf(fout,"%d%c%d",tmin,' ',i);
  fclose(fout);
  return 0;
}