hash

UVA 10125】Sumsets

在一串大小为s的数列中,是否存在a + b + c = d, 如果存在,输出最大的d,否则输出no solution

这题的数据很水,直接暴力也是能过的

#include <bits/stdc++.h>
using namespace std;
#define maxn 500510
#define inf 0x7FFFFFFF
int p[1005];
int head[maxn],next[maxn];
struct node 
{
	int x,y,sum;
}b[maxn];
int Hash(int s)
{
	int seek = (s >> 1) + (s << 1);
	return (seek & inf) % 500503;
}
int insert(int s)
{
	int h = Hash(b[s].sum);
	int u=head[h];
	while(u)
	{
		if(b[u].sum == b[s].sum) return 0;
		u = next[u];
	}
	next[s]=u;
	head[h]=s;
	return 1;
}
int search(int x , int y)
{
	int h = Hash(p[x] - p[y]);
	int u = head[h];
	while(u)
	{
		if(p[x] - p[y] == b[u].sum && x != b[u].x && y != b[u].y && x != b[u].y && y != b[u].x) return 1;
		u = next[u];
	}
	return 0;
}
int main()
{
	int n;
	while(~scanf("%d",&n))
	{
		if(n==0) break;
		for(int i=0;i<n;i++)
		{
			scanf("%d",&p[i]);
		}
		int num=1,maxv=-inf;
		memset(head,0,sizeof(head));
		for(int i=0;i<n;i++)
		{
			for(int j=i+1;j<n;j++)
			{
				b[num].sum = p[i] + p[j];
				if(insert(num))
				{
					b[num].x = i;
					b[num].y = j;
					num++;
				}
			}
		}
		for(int i = 0 ; i < n ; i++)
		{
			for(int j = 0 ; j < n ; j++)
			{
				if(j != i && search(i , j) && maxv < p[i])
				{
					maxv = p[i];
				}
			}
		}
		if(maxv == -inf) printf("no solution\n");
		else printf("%d\n",maxv);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值