Cod sursa(job #137586)

Utilizator hazegirlCatalina Predoi hazegirl Data 17 februarie 2008 12:45:45
Problema Stalpi Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasa a 10-a Marime 1.25 kb
//stalpi
#include<fstream.h>
 long int n,x[100001], c[100001], s[100001], d[100001],v[100001];
 long long int min,sum;

/*
long int sort(long int p, long int q)
{long int st=p, dr=q, a=x[st], b=c[st], e=s[st], f=d[st];
while(st<dr)
{while(st<dr && a<=x[dr]) dr--;
x[st]=x[dr]; c[st]=c[dr]; s[st]=s[dr], d[st]=d[dr];
while(st<dr && a>=x[st]) st++;
x[dr]=x[st]; c[dr]=c[st]; s[dr]=s[st], d[dr]=d[st];
}
x[st]=a; c[st]=b; s[st]=e; d[st]=f;
return st;
}

void qsort(long int p, long int q)
{long int m=sort(p,q);
if(m-1>p) qsort(p,m-1);
if(m+1<q) qsort(m+1,q);
}
			*/
void afisare()
{for(long int i=1;i<=n;i++)
	if(v[i]==0) return;
if(sum<min) min=sum;
}

void back(long int k)
{for(long int i=k;i<=n;i++)
	{v[i]++;
	sum+=c[i];
	if(sum >min) {sum-=c[i]; v[i]--; return;}
	 for(long int j=1;j<=n;j++)
		if(j!=i)
			if(x[j]>=(x[i]-s[i]) && x[j]<=(x[i]+d[i]))
				v[j]++;
        afisare();
	back(i+1);
	for (j=1;j<=n;j++)
		if(j!=i)
			if(x[j]>=x[i]-s[i] && x[j]<=x[i]+d[i]);
				v[j]--;
	sum-=c[i];
	v[i]--;
	}


}

int main ()
{long int i;
ifstream f("stalpi.in");
ofstream g("stalpi.out");
f>>n;
for(i=1;i<=n;i++)
	{f>>x[i]>>c[i]>>s[i]>>d[i];  min+=c[i];}
//qsort(1,n);
back(1);
g<<min;
f.close();g.close();
return 0;

}