Cod sursa(job #435233)

Utilizator MEmmaMirica Emma MEmma Data 7 aprilie 2010 03:51:11
Problema Gutui Scor 0
Compilator c Status done
Runda teme_upb Marime 2.94 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void printVec(int *v, int n)
{
     int i;
     for ( i = 0; i<n; i++)
          printf("%.2d ",v[i]);
     printf("\n");
}

int max(int a, int b)
{
     return (a < b) ? b : a;
}

void merge(int *h,int *w, int p, int q, int r, int H, int U) {
	int i = p;
	int j = q + 1;
	
	int *tmp = (int*)malloc((r - p + 1) * sizeof(int));
	int *tmp2 = (int*)malloc((r - p + 1) * sizeof(int));
	int k = 0;
	
	while ((i <= q) && (j <= r)) {
		if (((H-h[i])/U < (H-h[j])/U ) ){
		     tmp2[k] = w[i];
			tmp[k++] = h[i++];
			} 
		else{
		     tmp2[k] = w[j];
			tmp[k++] = h[j++];
			}
	}
	
	while (i <= q){
	     tmp2[k] = w[i];
		tmp[k++] = h[i++];
	}
	
	while (j <= r){
	     tmp2[k] = w[j];
		tmp[k++] = h[j++];
	}
	
	memcpy(h + p, tmp, (r - p + 1) * sizeof(int));
	memcpy(w + p, tmp2, (r - p + 1) * sizeof(int));
	free(tmp);
	free(tmp2);
}

void merge2(int *h,int *w, int p, int q, int r, int H, int U) {
	int i = p;
	int j = q + 1;
	
	int *tmp = (int*)malloc((r - p + 1) * sizeof(int));
	int *tmp2 = (int*)malloc((r - p + 1) * sizeof(int));
	int k = 0;
	
	while ((i <= q) && (j <= r)) {
	     printf("*%d\n ",h[i]+i*U);
		if ((h[i]+i*U)<=H && (h[j] + i*U)<=H){
		     tmp2[k] = w[i];
			tmp[k++] = h[i++];
			} 
		else{
		     tmp2[k] = w[j];
			tmp[k++] = h[j++];
			}
	}
	
	while (i <= q){
	     tmp2[k] = w[i];
		tmp[k++] = h[i++];
	}
	
	while (j <= r){
	     tmp2[k] = w[j];
		tmp[k++] = h[j++];
	}
	
	memcpy(h + p, tmp, (r - p + 1) * sizeof(int));
	memcpy(w + p, tmp2, (r - p + 1) * sizeof(int));
	free(tmp);
	free(tmp2);
}


void mergeSort(int *h, int *w, int p, int r,int H, int U)
{
     if (p<r){
          int q = (p+r)/2;
          mergeSort(h,w,p,q,H,U);
          mergeSort(h,w,q+1,r,H,U);
          merge(h,w,p,q,r,H,U);
     }
}

void mergeSort2(int *h, int *w, int p, int r,int H, int U)
{
     if (p<r){
          int q = (p+r)/2;
          mergeSort2(h,w,p,q,H,U);
          mergeSort2(h,w,q+1,r,H,U);
          merge2(h,w,p,q,r,H,U);
     }
}
int main()
{
     int N,H,U;
     FILE *f, *g;
     f = fopen("G2.in","r");
     g = fopen("gutui.out","w");
     fscanf(f,"%d%d%d",&N,&H,&U);
     int h[N],w[N];
     int i,j;
     for ( i = 0; i<N; i++)
          fscanf(f,"%d %d\n",&h[i],&w[i]);
      mergeSort(h,w,0,N-1,H,U);
      //mergeSort2(h,w,0,N-1,H,U);
      for ( i = 0; i<N-1; i++)
          for ( j = i+1; j<N; j++)
               if ((h[i] + i*U >H) && (h[j] + i*U)<=H && (h[j] + j*U)>H && w[j]>w[i]){
                    int aux = h[i];
                    h[i] = h[j];
                    h[j] = aux;
                    aux = w[i];
                    w[i] = w[j];
                    w[j] = aux;
                }
                    
      printVec(h,N);
      printf("\n");
      printVec(w,N);
      int Gmax = 0;
      j = 0;
      for ( i = 0; i<N; i++)
          if (h[i]+j*U<=H){
               Gmax+=w[i];
               j++;
          }
      fprintf(g,"%d\n",Gmax);
      fclose(f);
      fclose(g);
      return 0;
}