10125 - Sumsets(*****)

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=111&page=show_problem&problem=1066

/*
推荐题型:五星
题意:从数集中找出满足条件:d=a+b+c的所有情况,输出d可取的最大值
hash函数处理,使用数组head和next来实现。
*/

#include <cstdio>
#include <cstring>
#include <algorithm>
const int hMax=1000010,nMax=1010;
int head[hMax],next[hMax];
int st[hMax][2];
long long a[nMax],sum[hMax];

int hash(long long u)
{
	u=(((int)u<<1)+((int)u>>1))/2;
	return (u & 0x7fffffff)%hMax;
}

void insert(int k)
{
	int h=hash(sum[k]);
	next[k]=head[h];
	head[h]=k;
}

bool find(int x,int y,long long ans)
{
	int h=hash(ans);
	for(int i=head[h];i!=-1;i=next[i])
		if(sum[i]==ans && st[i][0]!=x && st[i][0]!=y && st[i][1]!=x && st[i][1]!=y)
			return true;
	return false;
}

int main()
{
	//freopen("data.in","r",stdin);
	int n;
	while(scanf("%d",&n) && n)
	{
		memset(head,-1,sizeof(head));
		for(int i=0;i<n;i++)
			scanf("%lld",&a[i]);
		std::sort(a,a+n);
		int k=0;
		for(int i=0;i<n;i++)
			for(int j=i+1;j<n;j++)
			{
				sum[k]=a[i]+a[j];
				st[k][0]=i;st[k][1]=j;
				insert(k);
				k++;
			}
		int max=-1;
		for(int i=n-1;i>=0 && max==-1;i--)
			for(int j=0;j<n && max==-1;j++)
				if(i==j)
					continue;
				else
				{
					if(find(i,j,a[i]-a[j]))
						max=i;
				}
		if(max==-1)
			printf("no solution\n");
		else
			printf("%lld\n",a[max]);
	}
	return 0;
}


/*
普通解法,超时!
*/

#include <cstdio>
#include <algorithm>
//using namespace std;
int n,S[1010];
int search(int u)
{
	bool ok=false;
	int left=0,right=n-1,mid;
	while(left<=right)
	{
		mid=(left+right)/2;
		if(u>S[mid])
			left=mid+1;
		else if(u<S[mid])
			right=mid-1;
		else
		{
			ok=true;
			break;
		}
	}
	if(ok)
		return mid;
	else if(left==n)
		return -2;
	else
		return -1;
}
int main()
{
	//freopen("data.in","r",stdin);
	int count;
	while(scanf("%d",&n)==1)
	{
		if(n==0)
			break;
		count=0;
		for(int i=0;i<n;i++)
			scanf("%d",&S[i]);
		std::sort(S,S+n);
		int max=-1;
		for(int a=0;a<n;a++)
			for(int b=a+1;b<n;b++)
				for(int c=b+1;c<n;c++)
				{
					int k=search(S[a]+S[b]+S[c]);
					if(k>=0)
					{
						if(k>max)
							max=k;
					}
					else if(k==-2)
						break;
				}
		if(max!=-1)
			printf("%d\n",S[max]);
		else
			printf("no solution\n");
	}
	return 0;
}


你可能感兴趣的:(10125 - Sumsets(*****))