首页 > 代码库 > UVa 10125 - Sumsets
UVa 10125 - Sumsets
题目:给你n个数让你在里面找到会不相同的4个数a,b,c,d,使得 d = a + b + c。
分析:数学题,散列表。这是一个优化问题。
方法1:暴力法;
先排序,然后直接利用四层循环求解,找到解后直接跳出,也可以以利用二分代替最后一层循环;
这种方法,如果遇到特殊的数据就会TLE;
方法2:分步计算;
将等式转化为 d - a = b + c;我们分别求解两边的结果,然后找到结果相同的值即可;
查找方法,可以使用散列表储存b + c 或 a + b 的值,供另一边查找;也可存进数组,二分查找。
说明:存储时记录计算的两个元素的下标,每个数字都不同;注意哈希值可能为负。
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> using namespace std; /* Hash define */ #define nodesize 500000 #define hashsize 1000 typedef struct node { int value,l,r; node* next; }list; list dict[nodesize+1]; list* head[hashsize+1]; class Hash { private: int size; public: Hash(){size = 0;memset( head, 0, sizeof(head) );} int hash( int value ) {return abs(value)%hashsize;} void insert( int value, int i, int j ) { int id = hash(value); dict[size].value = http://www.mamicode.com/value; >
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。