HDU 4334 Trouble(哈希表)
2012-09-11 21:44
489 查看
题目链接
刷一下存在感。。。多校的题目,其实以前也知道哈希的的用法,一直不知道如何实现,今天咨询了一下宝哥,然后讲解了一下他的代码,有点像是邻接中的挂链的形式。
这个哈希 是运用对一个素数取模的办法,注意一下要先枚举两个数建立哈希,如果3个数,会超内存,效率目测也不好。静态的比动态申请内存稍快,这个题,建哈希不是最主要的矛盾。。。
刷一下存在感。。。多校的题目,其实以前也知道哈希的的用法,一直不知道如何实现,今天咨询了一下宝哥,然后讲解了一下他的代码,有点像是邻接中的挂链的形式。
这个哈希 是运用对一个素数取模的办法,注意一下要先枚举两个数建立哈希,如果3个数,会超内存,效率目测也不好。静态的比动态申请内存稍快,这个题,建哈希不是最主要的矛盾。。。
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #define M 177777 #define ll __int64 using namespace std; struct node { ll data; struct node *next; } *head[M],key[60000]; ll p[6][201]; int main() { int i,j,k,t,n,z,num; ll s,m; scanf("%d",&t); while(t--) { scanf("%d",&n); num = 0; memset(head,0,sizeof(head)); for(i = 1; i <= 5; i ++) { for(j = 1; j <= n; j ++) { scanf("%I64d",&p[i][j]); } } for(i = 1; i <= n; i ++) { for(j = 1; j <= n; j ++) { node *q1 = &key[num ++];//静态申请的内存。 m = p[1][i]+p[2][j]; q1 -> data = m; m = m%M; if(m < 0) m += M; q1 -> next = head[m]; head[m] = q1; } } z = 0; for(i = 1; i <= n&&!z; i ++) { for(j = 1; j <= n&&!z; j ++) { for(k = 1; k <= n&&!z; k ++) { s = p[3][i]+p[4][j]+p[5][k]; m = -s; m = m%M; if(m < 0)//防止出现负数 m += M; node *q1; for(q1 = head[m]; q1 != NULL; q1 = q1->next) { if(q1 -> data == -s) { z = 1; break; } } } } } if(z) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- HDU - 4334 Trouble(哈希)
- HDU 4334 Trouble
- HDU 4334 Trouble (数组合并)
- HDU-4334 Trouble 哈希表Or有序表查找
- Trouble&&http://acm.hdu.edu.cn/showproblem.php?pid=4334
- HDU 4334 Trouble 和 HDU 1496 Equations( hash)
- HDU 4334——Trouble——————【贪心&水题】
- HDU 4334 Trouble
- HDU 4334 Trouble
- hdu 4334 Trouble
- hdu 4334 Trouble 排序+优化 多校联合赛(四)第四题
- HDU 4334 Trouble(哈希|线性查找)
- HDU 4334 Trouble (数组合并)
- HDU 4334 Trouble (暴力)
- HDU 4334 Trouble(Hash)
- hdu 4334 Trouble
- 哈希 HDU 4334 trouble
- hdu 4334 Trouble(两个数组寻找目标和)
- HDU 4334 Trouble (暴力)
- HDU 4334 Trouble