Cod sursa(job #124946)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 20 ianuarie 2008 10:32:49
Problema Partitie Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasa a 9-a Marime 1.3 kb
//partitie
#include<stdio.h>
FILE*fin=fopen("partitie.in","r");
FILE*fout=fopen("partitie.out","w");
long n,d,si[100],subm[100],so[100],psi[100];
void rech(long nod,long dim)
{
  long min=so[nod],nm=nod,ls=nod*2,rs=nod*2+1,aux;
  if(ls<=dim&&so[ls]<min){min=so[ls];nm=ls;}
  if(rs<=dim&&so[rs]<min){min=so[rs];nm=rs;}
  if(nm!=nod)
  {
    aux=so[nod];so[nod]=so[nm];so[nm]=aux;
    aux=psi[nod];psi[nod]=psi[nm];psi[nm]=aux;
    rech(nm,dim);
  }
}
int main()
{
  long i,j,aux,r,stop,dr,dn;
  fscanf(fin,"%ld" "%ld",&n,&d);
  for(i=1;i<=n;i++)
  {
    fscanf(fin,"%ld",&si[i]);
    so[i]=si[i];psi[i]=i;
  }

  fclose(fin);
  //ordsir
  for(i=n/2;i>=1;i--)
    rech(i,n);
  dn=n;
  while(dn>0)
  {
    aux=so[1];so[1]=so[dn];so[dn]=aux;
    aux=psi[1];psi[1]=psi[dn];psi[dn]=aux;
    rech(1,dn-1);
    dn--;
  }
  //rez
  for(dr=2;dr<=n;dr++)
    if(so[1]-so[dr]>=d) break;
  r=dr;
  for(i=1;i<dr-1;i++)
  {
    subm[psi[i]]=i;
    subm[psi[r]]=i;
    for(stop=r+1;stop<=n;stop++)
    {
      if(so[i+1]-so[stop]>=d) break;
      subm[psi[stop]]=i;
    }
    r=stop;
  }
  subm[psi[dr-1]]=dr-1;
  for(i=r;i<=n;i++)
    subm[psi[i]]=dr-1;
  fprintf(fout,"%ld" "%c",dr-1,'\n');
  for(i=1;i<=n;i++)
    fprintf(fout,"%ld" "%c",subm[i],'\n');
  fclose(fout);
  return 0;
}