Cod sursa(job #181680)

Utilizator albuaAlbu Alexandru albua Data 18 aprilie 2008 18:58:23
Problema Partitie Scor 10
Compilator c Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <stdio.h>

typedef struct 
  {
    int val,indice,grupa;
  }element;

int n,d,c[100],i,lastgr,ok,j;
element a[100];
FILE *f,*g;

int divide(int ls, int ld)
{
  int s,d;
  element aux;
  s=ls;  d=ld;
  aux=a[ls];
  while(s<d)
    {
	  while((s<d) && (a[d].val>aux.val))d--;
	  a[s]=a[d];
	  while((s<d) && (a[s].val<=aux.val))s++;
	  a[d]=a[s];
	}
  a[s]=aux;
  return s;
}  
  
void quick(int ls, int ld)
{
  int k;
  if(ls<ld)
    {
	  k=divide(ls,ld);
	  quick(ls,k-1);
	  quick(k+1,ld);
	}
}  

int divide2(int ls, int ld)
{
  int s,d;
  element aux;
  s=ls;  d=ld;
  aux=a[ls];
  while(s<d)
    {
	  while((s<d) && (a[d].indice>aux.indice))d--;
	  a[s]=a[d];
	  while((s<d) && (a[s].indice<=aux.indice))s++;
	  a[d]=a[s];
	}
  a[s]=aux;
  return s;
}  
  
void quick2(int ls, int ld)
{
  int k;
  if(ls<ld)
    {
	  k=divide2(ls,ld);
	  quick2(ls,k-1);
	  quick2(k+1,ld);
	}
}  

  
int main()
{
  f=fopen("partitie.in","r");
  g=fopen("partitie.out","w");
  fscanf(f,"%d %d\n",&n,&d);
  for(i=1;i<=n;i++)
    {
      fscanf(f,"%d\n",&a[i].val);
	  a[i].indice=i;
	}
  quick(1,n);
  a[1].grupa=1;
  lastgr=1;
  for(i=2;i<=n;i++)
    {
	  ok=0;
	  for(j=i-1;(j>=1)&&(!ok);j--)
	    if((a[i].val-a[j].val)>=d)
		  {
		    ok=1;
			a[i].grupa=a[j].grupa;
		  }
	  if(ok==0)
	    a[i].grupa=++lastgr;
	}
  quick2(1,n);
  
  //afisare
  fprintf(g,"%d\n",lastgr);
  for(i=1;i<=n;i++)
    fprintf(g,"%d\n",a[i].grupa);
  fclose(f);   fclose(g);
  return 0;
}