UVA 10125 Sumsets

UVA_10125

    核心的思想就是先把a+b的值建一个哈希表,然后枚举d-c的值,如果找到和d-c相同的a+b并且4个元素各不相同的话,就更新一下最后结果。

    当然,哈希函数的设计可以随意的,如果超时了不妨换一个。

#include<stdio.h>
#include<string.h>
#include<math.h>
#define HASH 1000003
#define MAXN 1010
#define MAXD 1000010
#define INF 1000000000000ll
int N, head[HASH], next[MAXD], st[MAXD][2];
long long int max, a[MAXN], sum[MAXD];
int hash(long long int x)
{
int h = ((int)x << 1) + ((int)x >> 1);
return (h & 0x7fffffff) % HASH;
}
void insert(int s)
{
int i, h = hash(sum[s]);
next[s] = head[h];
head[h] = s;
}
int find(int x, int y, long long int ans)
{
int i, h = hash(ans);
for(i = head[h]; i != -1; i = next[i])
if(sum[i] == ans && st[i][0] != x && st[i][1] != x && st[i][0] != y && st[i][1] != y)
break;
if(i == -1)
return 0;
return 1;
}
void solve()
{
int i, j, k;
memset(head, -1, sizeof(head));
for(i = 0; i < N; i ++)
scanf("%lld", &a[i]);
k = 0;
for(i = 0; i < N; i ++)
for(j = i + 1; j < N; j ++)
{
sum[k] = a[i] + a[j];
st[k][0] = i, st[k][1] = j;
insert(k);
++ k;
}
max = -INF;
for(i = 0; i < N; i ++)
for(j = i + 1; j < N; j ++)
{
if(find(i, j, a[i] - a[j]) && a[i] > max)
max = a[i];
if(find(j, i, a[j] - a[i]) && a[j] > max)
max = a[j];
}
if(max == -INF)
printf("no solution\n");
else
printf("%lld\n", max);
}
int main()
{
for(;;)
{
scanf("%d", &N);
if(!N)
break;
solve();
}
return 0;
}


原文地址:https://www.cnblogs.com/staginner/p/2306650.html