Cod sursa(job #434493)

Utilizator stoikStoica George Cristian stoik Data 6 aprilie 2010 00:14:30
Problema Gutui Scor 10
Compilator c Status done
Runda teme_upb Marime 1.17 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
  long h;
  long g;
} gutui;

long u;

int compare(const void* a, const void* b)
{
  long h = u;
  gutui* a1 = (gutui *)a;
  gutui* b1 = (gutui *)b;
  
  long k = (a1->h)/h;
  if (((a1->h) % h) == 0) k--;
  long t = (b1->h)/h;
  if (((b1->h) % h) == 0) t--;
 // printf("%ld %ld (%ld) (%ld)\n",k, t, a1->h, b1->h);
  if (k == t) return (-(a1->g) + (b1->g));
    else return (t - k);
}

int main()
{
  long n,h;
  FILE *f = fopen("gutui.in","r");
  FILE *ff = fopen("gutui.out","w");
  
  fscanf(f,"%ld %ld %ld",&n, &h, &u);
  long i;
  gutui *a = (gutui *)calloc(n,sizeof(gutui));
  for (i=0; i<n; i++)
    fscanf(f,"%ld %ld",&a[i].h, &a[i].g);
  
  qsort (a, n, sizeof(gutui), compare);
  /*for (i=0; i<n; i++)
    printf("**%ld %ld\n",a[i].h,a[i].g);
  */
  long t = 0;
  long g = 0;
  long j;

  i = 0;
  for (j=0; j<n; j++)
  {
    //int k1 = a[j].h/u;
    t = a[j].h+i*u;
    if (t<=h)
    {
      //t=a[j].h+i*u;
      //if (t>h) break;
      g+=a[j].g;
      i++;
      //k = k1;
    }
  }
  fprintf(ff,"%ld",g);
  
  //printf("%d %d %d %d\n",n,h,u,a[n-1].g);
  fclose(f);
  fclose(ff);
  return 0;
}