Cod sursa(job #439007)

Utilizator MirceaMMircea Muscalu MirceaM Data 11 aprilie 2010 11:30:28
Problema Gutui Scor 10
Compilator c Status done
Runda teme_upb Marime 1.64 kb
#include <stdio.h>
#include <stdlib.h>

typedef struct{
  int a,b;
} gutuie;

int comp(const void *a, const void *b){
    gutuie x=*(gutuie*)a;
    gutuie y=*(gutuie*)b;
    
    if(x.a>y.a) return -1;
    if(x.a==y.a) return (x.b-y.b);
    return 1;
    
}



int main(){
    
    int i,n,k,h,p,u,v[100000],max=0,aux;
    gutuie x[100000];
    
    FILE *f = fopen("gutui.in","rt");
    fscanf(f,"%i %i %i\n",&n,&h,&u);
    
    for(i=0;i<n;i++)
    {
       fscanf(f,"%i %i\n",&x[i].a,&x[i].b);
       if(u!=0)
       if(x[i].a>h) x[i].a=-1;
       else x[i].a=(h-x[i].a)/u;
    }
    close(f);
    
    qsort(&x,n,sizeof(gutuie),comp);
    
   /* for(i=0;i<n;i++)
      printf("%i %i\n",x[i].a,x[i].b);*/
    
    
    
    if(u==0)
      for(i=n-1;i>=0;i--)
      {
       if(x[i].a>h) {
                   f = fopen("gutui.out","wt");
                   fprintf(f,"%i",max);
                   close(f);
                   return 0;
                   }
      max+=x[i].b;
      }
    
    
    
    v[0]=x[0].b;
    for(i=1;i<n;i++)
    {
       if(x[i].a<0) break;
       p=1;
       v[i]=x[i].b;
       for(k=i-1;k>=0;k--)
         {           
             if(x[k].a>=p) {
                           v[i]=v[i]+x[k].b;
                           p++;
                           }
         }
       if(v[i]>max) max=v[i];    
    }
    
    if (max==-1) max=0;
    
    for (i=0;i<n;i++){
        printf("%i ",v[i]);
    }  
      
  /*  printf("\n%i\n",max);*/
    
    f = fopen("gutui.out","wt");
    fprintf(f,"%i",max);
    close(f);
    
    
  /*  getch();*/
    return 0;
}