uva10125 Sumsets

2024-06-12 17:58
文章标签 sumsets uva10125

本文主要是介绍uva10125 Sumsets,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

看似简单的题,其实要求考虑的非常严密

首先如果枚举a,b,c再判断d的话肯定超时,即使用hash存d也一样,解决办法是根据a+b=d-c先把所有d-c的值用hash存起来,再枚举所有a+b,这样枚举量就减小到1000*999了。

然后,每组a,b和每组c,d都必须考虑,不能先排序再枚举1000*999/2,因为d不一定是四个数字中最小的。

最后,当a+b==d-c时,还必须判断他们互不相等。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define HASHSIZE 10000003
#define MAX 5000000
using namespace std;
int s[1000],head1[HASHSIZE],next1[MAX],s1[MAX][2];int hash(int value)
{if(value<0)value=-value;return (value)%HASHSIZE;
}void insert(int i,int j,int t)
{int sum=s[j]-s[i];int hashvalue=hash(sum);int u=head1[hashvalue];while(u!=-1){u=next1[u];}next1[t]=head1[hashvalue];head1[hashvalue]=t;
}
int find(int i,int j)
{int all=s[i]+s[j];int hashvalue=hash(all);int u=head1[hashvalue];while(u!=-1){if(s[s1[u][1]]-s[s1[u][0]]==all&&s[s1[u][1]]!=s[i]&&s[s1[u][1]]!=s[j]&&s[s1[u][0]]!=s[i]&&s[s1[u][0]]!=s[j])return s[s1[u][1]];u=next1[u];}return -1000000000;
}
int main()
{int n,i,j,t,flag,help,large;while(scanf("%d",&n)&&n){flag=0;large=-1000000000;memset(head1,-1,HASHSIZE*4);for(i=0;i<n;i++){scanf("%d",&s[i]);}//sort(s,s+n);t=0;for(i=0;i<n;i++){for(j=0;j<n;j++){if(i==j)continue;s1[t][0]=i;s1[t][1]=j;insert(i,j,t);t++;}}for(i=0;i<n;i++){for(j=0;j<n;j++){if(i==j)continue;if((help=find(i,j))!=-1000000000){flag=1;if(help>large)large=help;}}}if(flag==0)printf("no solution\n");elseprintf("%d\n",large);}return 0;
}


这篇关于uva10125 Sumsets的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054926

相关文章

10125-Sumsets【暴力】

利用n^2的时间枚举所有a[i] + a[j] 利用n^2的时间枚举所有a[i] - a[j] 之后利用n^2时间一个一个找a[i] - a[j]的值是否存在于a[i] + a[j]中 找的时候需要二分查找 另外一点就是注意long long的范围以及四个数是集合内不同的四个元素 15222638 10125 Sumsets Accepted C++ 0.449 2015-03-

POJ - 2229 Sumsets (动态规划)

题目连接 很巧妙的一道题,需要找到奇偶数的递推关系。 1、当N为奇数时:d[N] = d[N-1]; 2、当N为偶数时:d[N] = d[N-1] +d[N/2]; #include <iostream>#include <cstdio>using namespace std;const int MAX_N = 1000001;int d[MAX_N];int main()

c/ C - Sumsets

用递归写的,然后超时了,知道应该去找规律,可是。。。。没找到尴尬 C - Sumsets 1) 1+1+1+1+1+1+1 2) 1+1+1+1+1+2 3) 1+1+1+2+2 4) 1+1+1+4 5) 1+2+2+2 6) 1+2+4 递归的码 #include <iostream>using namespace std;int dou[25];

UVa 10125 - Sumsets

题目链接: UVa : http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1066 poj :   http://poj.org/problem?id=2549 类型: 哈希, 二分查找 原题: Given

POJ 2549---Sumsets(二分枚举)

传送门:http://poj.org/problem?id=2549 Description Given S, a set of integers, find the largest d such that a + b + c = d where a, b, c, and d are distinct elements of S. Input Several S, each consisting