• 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;
    }


  • 相关阅读:
    Visual Studio Code 工具使用教程
    JS获取节点的兄弟,父级,子级元素
    动态加载js
    实用的文本和图片无缝滚动效果
    兼容各种浏览器的文字循环无缝滚动效果
    中文乱码
    js 循环json
    js中获取basePath
    json转换为map
    java des 加密/解密
  • 原文地址:https://www.cnblogs.com/staginner/p/2306650.html
Copyright © 2020-2023  润新知