POJ3349 Snowflake Snow Snowflakes(hash)
2016-04-28 19:40
429 查看
题意:
雪花有六条棱,每条棱对应一个数,要求在一组雪花中看能否寻找到所有棱对应相同的雪花(棱有顺序要求)。
要点:
刚自学了一下hash,这题刚上手有点思路但自己实在也写不出来,看了网上的代码觉得还是很简单的。首先这题只要用取余hash即可,将每条棱求和进行取余hash,然后用m[sum]记录有几个雪花sum相同,然后用snow[sum][m[sum]]存储这个雪花即可,还是比较简单的,这题的key值要设成一个比较大的素数,同时也要兼顾一下数组的范围,所以也不能太大。
雪花有六条棱,每条棱对应一个数,要求在一组雪花中看能否寻找到所有棱对应相同的雪花(棱有顺序要求)。
要点:
刚自学了一下hash,这题刚上手有点思路但自己实在也写不出来,看了网上的代码觉得还是很简单的。首先这题只要用取余hash即可,将每条棱求和进行取余hash,然后用m[sum]记录有几个雪花sum相同,然后用snow[sum][m[sum]]存储这个雪花即可,还是比较简单的,这题的key值要设成一个比较大的素数,同时也要兼顾一下数组的范围,所以也不能太大。
15448052 | Seasonal | 3349 | Accepted | 27620K | 3000MS | C++ | 912B | 2016-04-28 19:28:34 |
#include<cstdio> #include<algorithm> #define maxn 10000 #define key 9997 using namespace std; struct node { int f[7]; }; int m[maxn];//存储sum相同的雪花个数 node snow[maxn][100]; bool cmp(node a, node b) { sort(a.f, a.f + 6); //先排序再比较即可 sort(b.f, b.f + 6); for (int i = 0; i < 6; i++) { if (a.f[i] != b.f[i]) return false; } return true; } int main() { int n,i,j; while (scanf("%d", &n) != EOF) { memset(m, 0, sizeof(m)); bool ok = false; while(n--) { int sum = 0; node temp; for (i = 0; i < 6; i++) { scanf("%d", &temp.f[i]); sum = (sum + temp.f[i]) % key;//求和进行简单的取余hash,这里要进行取余操作否则数组会过大 } if (!ok) { for (i = 0; i < m[sum]; i++) { if (cmp(temp, snow[sum][i])) { ok = true; break; } } snow[sum][m[sum]] = temp; //snow记录总和为sum中的第m[sum]个关键字 m[sum]++; } } if (ok) printf("Twin snowflakes found.\n"); else printf("No two snowflakes are alike.\n"); } return 0; }
相关文章推荐
- linux命令之top源码可编译版
- 人月神话阅读笔记02
- hadoop处理Excel通话记录
- VS2013为私有方法创建和运行单元测试
- STL学习_SGI二级空间配置器源码剖析
- 第六周 周记
- poj 1584(综合性强的计算几何,好题)
- 对软件架构的认识
- hadoop正式学习之redis------redis的学习和操作1
- ZOJ 3684 Destory 找树的中心
- 前端面试题目总结
- Console.read()、Console.readline()、Console.readkey()和Console.Write()、Console.Writeline()的区别
- 0428 团队项目合作2.0作业
- LeetCode342. Power of Four
- Java泛型-类型擦除
- 10033 - Interpreter
- 技术分享:逆向海盗船k95机械键盘
- 快速排序
- JSP自定义标签开发入门
- linux的基本结构