Cod sursa(job #391934)

Utilizator mihai995mihai995 mihai995 Data 6 februarie 2010 15:34:14
Problema Loto Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <fstream>
using namespace std;
#include <cstdlib>
long v[101],s;
int sol[7],k,n;
ifstream f("loto.in");
ofstream o("loto.out");
int comp(const void *a,const void *b) {return *(long*)a-*(long*)b;}
inline int succ() {if (sol[k]<n) {sol[k]++;return 1;} return 0;}
inline int valid(){if (sol[k]>=sol[k-1]) return 1; return 0;}
inline int sum(){long sm=v[sol[1]]+v[sol[2]]+v[sol[3]]+v[sol[4]]+v[sol[5]]+v[sol[6]];if (sm==s) return 1;return 0;}
int scr()
{
	long sm=v[sol[1]]+v[sol[2]]+v[sol[3]]+v[sol[4]]+v[sol[5]]+v[sol[6]];
	if (sm!=s) return 0;
	for (int i=1;i<=6;i++)
		o<<v[sol[i]]<<" ";
	return 1;
}
int back()
{
	int as;
	k=1;sol[k]=0;
	while (k)
	{
		do{} while((as=succ())&&(!valid()));
		if (as) if (k==6) {if (scr()) return 1;}
					else {k++;sol[k]=0;}
			else k--;
	}
	return 0;
}
void loto()
{
	int i,k=0;
	f>>n>>s;
	for(i=1;i<=n;i++)
		f>>v[i];
	qsort(v+1,n,sizeof(long),comp);
	if (6*v[n]<s) {o<<"-1";return;}
	for (i=n;i>=1;i--)
	{
		if (6*v[i]==s) {o<<v[i]<<" "<<v[i]<<" "<<v[i]<<" "<<v[i]<<" "<<v[i]<<" "<<v[i];return;}
		if (6*v[i]<s) {k=i;break;}
	}
	if (k==0 && 6*v[1]>s) {o<<"-1";return;}
	if (!back()) o<<"-1";
}
int main()
{
	loto();
	return 0;
}