Cod sursa(job #164581)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 24 martie 2008 15:42:09
Problema Vanatoare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include<stdio.h>   
struct poz{   
    long int inf, mis[17], nr;   
     poz *next;   
};   
  
poz *pprim,*paux;   
long p1,v[17],n,t,ok,j,sol=16,S[17],i,nv,mc,inf1,inf2,k;   
void pune(long int pp, long mm);   
int main()   
{   FILE *f=fopen("vanatoare.in","r"), *g=fopen("vanatoare.out","w");
    fscanf(f,"%ld%ld",&n,&t);   
    for(i=1;i<=n;i++) { fscanf(f,"%ld%ld",&p1,&v[i]);   
                        pune(p1,i);   
                        }   
    ok=1;   
    for(paux =pprim;paux;paux=paux->next)   
        S[++j]=paux->inf;   
    while(pprim)   
    {   
        while(pprim->nr){   
            mc=pprim->mis[pprim->nr];   
            pprim->nr--;   
            inf1=pprim->inf;   
            inf2=pprim->next->inf;   
            k=(inf2-inf1)/v[mc];   
            if(inf1+k*v[mc]!=inf2)   
                k++;   
            pune(inf1+k*v[mc],mc);   
        }   
        paux=pprim;   
        pprim=pprim->next;   
        delete paux;   
        if(ok){   
            nv--;   
            if(nv<sol){   
                sol=nv;   
                for(paux =pprim;paux;paux=paux->next)   
                    S[++j]=paux->inf;   
            }   
        }   
    }   
    fprintf(g,"%ld\n",sol);   
    for(i=1;i<=sol;i++)   
        fprintf(g,"%ld ",S[i]);   
    fcloseall();   
    return 0;
}
void pune( long int pp, long int mm)
{   poz *p,*q;
    if(pp>t){ok=0;return;}
    if(!pprim)
    { q=new poz;q->inf=pp;q->nr=1;q->mis[1]=mm;q->next=0;pprim=q;nv=1;return;}
    if(pp<pprim->inf)
    { q=new poz; q->inf=pp;q->nr=1; q->mis[1]=mm;q->next=pprim;pprim=q;nv++;return;}
    p=pprim;
    while(p->next)
    { if(p->inf==pp){ p->nr++; p->mis[p->nr]=mm; return;}
      if(p->next->inf>=pp){p=p->next;continue;}
      q=new poz;q->inf=pp;q->nr=1;q->mis[1]=mm;q->next=p->next;
      p->next=q;nv++;return;
    }
    if(p->inf==pp){ p->nr++; p->mis[p->nr]=mm; return;}
    q=new poz;q->inf=pp;q->nr=1;q->mis[1]=mm;
    p->next=q;q->next=0;nv++;
}