Cod sursa(job #164982)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 25 martie 2008 00:51:53
Problema Vanatoare Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<stdio.h>
long long n,t,i,c[18][18],v[18][18],nv_min,c_min[18];
void solve(long long nv,long long nm);
long long poz(long long c1,long long c2,long long v1,long long v2);
long long vit(long long v1,long long v2);
int main()
{
	FILE *f=fopen("vanatoare.in","r"),
	     *g=fopen("vanatoare.out","w");
	fscanf(f,"%lld%lld",&n,&t);
	for(i=1;i<=n;i++) fscanf(f,"%lld%lld",&c[n][i],&v[n][i]);
	nv_min=n;
	for(i=1;i<=n;i++) c_min[i]=c[n][i];
	solve(1,n);
	fprintf(g,"%lld\n",nv_min);
	for(i=1;i<=nv_min;i++)
	 fprintf(g,"%lld ",c_min[i]);
       fcloseall();
       return 0;
}
void solve(long long nv,long long nm)
{       long long ii,jj,cn,vn;
	if(nv>=nv_min)return;
	if(nv==nm)
	{nv_min=nv;for(ii=1;ii<=nv;ii++)c_min[ii]=c[nm][ii];return;}
	for(ii=1;ii<=nv;ii++)
	{ cn=poz(c[nm][ii],v[nm][ii],c[nm][nv+1],v[nm][nv+1]);
	  if(cn>t)continue;
	  vn=vit(v[nm][ii],v[nm][nv+1]);
	  for(jj=1;jj<=nv;jj++)
	  { c[nm-1][jj]=c[nm][jj];v[nm-1][jj]=v[nm][jj];}
	    c[nm-1][ii]=cn;v[nm-1][ii]=vn;
	  for(jj=nv+1;jj<nm;jj++)
	  { c[nm-1][jj]=c[nm][jj+1];v[nm-1][jj]=v[nm][jj+1];}
	  solve(nv,nm-1);
	}
	solve(nv+1,nm);
}
long long poz(long long c1,long long v1,long long c2,long long v2)
{   long long p1,p2;
    p1=c1;p2=c2;
    for(;;)
    { if(p1>t||p2>t||p1==p2)break;
      if(p1<p2)p1+=v1;
      else p2+=v2;
    }
    if(p1>t||p2>t)return t+1;
    return p1;
}
long long vit(long long v1,long long v2)
{       long long mare,mic,aux;
	mare=v1;mic=v2;
	while(mic)
	{ aux=mic;mic=mare%mic;mare=aux;}
	mic=v1/mare;mic*=v2;
	return mic;
}