Cod sursa(job #164587)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 24 martie 2008 15:47:38
Problema Vanatoare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 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)
    {   if(!pprim->next)break;
	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++;
}