Cod sursa(job #164549)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 24 martie 2008 14:53:45
Problema Vanatoare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 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;}
	p=pprim;
	while(p){ if(p->inf>pp) break; p=p->next;}
	if(p){ 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; q->next=p->next;
		   p->next=q; nv++;return;
	}
	q=new poz; q->inf=pp; q->nr=1; q->mis[1]=mm;p->next=q; nv++;

}