uva 10125 - Sumsets好题

本文介绍了一个寻找特定三元组的算法实现,通过预先计算和存储两数之和及其索引,快速判断是否存在满足条件的第三个数,使得这三个数之和等于特定目标值。该算法涉及哈希表的应用和优化技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<cstdlib>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<set>
#include<cstring>
#include <algorithm>
#define M 5368
#define N 1000010
#define inf 0x7f7f7f7f
using namespace std;
int head[N],next[N];
int a[1000],sum[N],st[N][2];
int hash(int u)
{
//    u=((u<<1)+(u>>1))/2;
//    return (u & 0x7fffffff)%N;
    if(a<0)
        a=-a;
    return a%N;
}
void insert(int k)
{
    int h=hash(sum[k]);
    next[k]=head[h];
    head[h]=k;
}
int find(int x,int y,int s)
{
    int h=hash(s);
    h=head[h];//容易忘掉!!wa
    while(h!=-1)
    {

        if(s==sum[h]&&st[h][0]!=x&&st[h][0]!=y&&st[h][1]!=x&&st[h][1]!=y)
            return 1;
        h=next[h];
    }
    return 0;
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("ex.in","r",stdin);
#endif
    int n;
    while(scanf("%d",&n))
    {
        memset(head,-1,sizeof(head));

        if(!n)
            break;
        for(int i=0; i<n; i++)
            scanf("%d",&a[i]);

        sort(a,a+n);
        int k=0;
        for(int i=0; i<n; i++)
            for(int j=i+1; j<n; j++)//降为o(n^2)
            {
                sum[k]=a[i]+a[j];
                insert(k);
                st[k][0]=i;
                st[k++][1]=j;
            }
        int flag=1;
        for(int i=n-1; i>=0; i--)
        {
            for(int j=0; j<n; j++)
                if(i==j)
                    continue;
                else if(find(i,j,a[i]-a[j]))
                {
                    flag=0;
                    printf("%d\n",a[i]);
                    break;
                }
            if(!flag)
                break;
        }
        if(flag)
            printf("no solution\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值