Cod sursa(job #230118)

Utilizator BiterBiter Marian Biter Data 13 decembrie 2008 00:40:39
Problema Stalpi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include<stdio.h>
#include<iostream.h>

typedef int stiva[50];



struct stalp
{
	int c;//cost
	int x;//pozitie
	int s;//stanga iluminare
	int d;//dreapta iluminare
};

stiva st;int n,p;stalp v[9999];int dim;



void init(int k,stiva &st)
{
	if (k==0) st[k]=0; else st[k]=st[k-1];
}

void succesor(int &as,stiva &st,int k)
{
	if (st[k]<n-k+p)
	{
		st[k]=st[k]+1;
		as=1;
	} 
	else
	{
		as=0;
	}
}


void valid(int &ev,stiva st,int k)
{
	int i;
	ev=1;

	for (i=1;i<k;i++)
	{
		if (st[i]==st[k]) ev=0;
	}
}

int solutie(int k)
{
	if (k==p) return(1); else return(0);
}

int tipar(stiva st)
{
	int i,viz[100],count,j;
	for(i=1;i<=dim;i++)
	{
		viz[i]=1;
	}
	for(i=1;i<=p;i++)
	{
		viz[st[i]]=0;
		
	}
	
	count=0;
	for(i=1;i<=dim;i++)
	{
		if (viz[i]==0)
		{
			for(j=1;j<=dim;j++)
			{
				if ((i!=j)&&(viz[j]==1))
				{
					if ((v[j].x-v[j].s<=v[i].x)&&(v[i].x<=v[j].x+v[j].d))
					{
						count++;
						j=dim+1;
					}
				}
			}
		}
	}
	int rez=0;
	
	if (count==p) 
	{ 
			for(i=1;i<=dim;i++)
			{
				if (viz[i]==1) rez+=v[i].c;
			}
	}
			return (rez);
}





int  main ()
{
	
	
	FILE *in,*out;
	in=fopen("stalpi.in","r");
	out=fopen("stalpi.out","w");
	int i;
	fscanf(in,"%d",&dim);

	for (i=1;i<=dim;i++)

	{
		
		fscanf(in,"%d",&v[i].x);
		fscanf(in,"%d",&v[i].c);
		fscanf(in,"%d",&v[i].s);
		fscanf(in,"%d",&v[i].d);
	}
    
	
	
	int as,ev,m,min=999;
	

	
	n=dim;
	for(p=1;p<n;p++)
	{
	int k=1;
	init(k,st);
	
	while (k>0)
	{
		
		do
		{
			succesor(as,st,k);
			if (as) valid(ev,st,k);
			
		}
		while ((as)&&(!( as && ev)));
		if (as) {
			if (solutie(k)) {m=tipar(st);if ((m<min)&&(m!=0)) min=m;} else
			{
				k++;
				init(k,st);
			}
		} else k--;
	}
	}
	fprintf(out,"%d",min);
	fclose(in);
	fclose(out);
	return 0;

}