- 浏览: 204284 次
- 性别:
- 来自: 武汉
-
文章分类
- 全部博客 (137)
- c++ (74)
- c++,算法,回溯 (2)
- DP问题。 (9)
- DP问题,0/1背包问题 (3)
- 数学问题 (6)
- 贪心算法 (10)
- 排序 (16)
- 数据结构 (7)
- 容器 (2)
- 模拟问题 (2)
- 水题 (8)
- 并查集 (3)
- 非技术 (2)
- 素数问题 (1)
- DFS (3)
- 二叉树 (1)
- 递归 (1)
- 图论 (5)
- 最小生成树 (5)
- 最短路径 (6)
- bell_flaod算法 (2)
- hash (3)
- 二分查找 (1)
- 搜索 (5)
- BFS (5)
- STL (3)
- 字符串hash (1)
- 拓扑排序 (1)
- 字典树 (4)
- 哈弗曼树 (1)
- KMP (7)
- 线段树 (9)
- 树状数组 (6)
- 全排列 (2)
- DP问题 (2)
- LCS (1)
- 最长不下降子序列 (2)
- 面试经验 (3)
题意:判断有没有两朵相同的雪花。每朵雪花有六瓣,比较花瓣长度的方法看是否是一样的,如果对应的arms有相同的长度说明是一样的。给出n朵,只要有两朵是一样的就输出有Twin snowflakes found.,如果任何两个都是不一样的输出No two snowflakes are alike。n=100,000。
思路:最简单的就是枚举每两片雪花,判断他们是否相同。时间复杂度为O(n*n),显然效果不理想。有没有更好的算法呢?hash:每读进一片雪花,将雪花hash,判断hash表里是否有相同的hash值,有相同的hash值,从链表中一一取出并判断是否同构,是同构得出结果。然后将该雪花加入到表中,所有雪花读完也没有发现相同的,则得出结果。
代码如下:
#include <stdio.h> #include <stdlib.h> #include <vector> #include <iostream> using namespace std; const int MAX_SIZE = 100005; //最大的雪花数 const int MOD_VAL = 90001; //hash函数,取余的数 int snow[MAX_SIZE][6]; //存储雪花信息 vector<int> hash[MOD_VAL]; //hash表,表中存储的是snow数组的下标 /*判断雪花a与雪花b是否同样 *输入:两个雪花在snow数组的下标 *输出:true or false */ bool isSame(int a, int b) { for(int i=0;i<6;i++) { if(/*顺时针方向*/ (snow[a][0] == snow[b][i] && snow[a][1] == snow[b][(i+1)%6] && snow[a][2] == snow[b][(i+2)%6] && snow[a][3] == snow[b][(i+3)%6] && snow[a][4] == snow[b][(i+4)%6] && snow[a][5] == snow[b][(i+5)%6]) || /*逆时针方向*/ (snow[a][0] == snow[b][i] && snow[a][1] == snow[b][(i+5)%6] && snow[a][2] == snow[b][(i+4)%6] && snow[a][3] == snow[b][(i+3)%6] && snow[a][4] == snow[b][(i+2)%6] && snow[a][5] == snow[b][(i+1)%6]) ) return true; } return false; } int main() { /*处理输入*/ int n; int i,j; scanf("%d", &n); for( i = 0; i < n; i++) { for( j = 0; j < 6; j++) { scanf("%d", &snow[i][j]); } } /*分别处理这n个雪花,判断有没两个雪花是相同的*/ int sum, key; for(i = 0; i < n; i++) { /*求出雪花六个花瓣的和*/ sum = 0; for( j = 0; j < 6; j++) { sum += snow[i][j]; } key = sum % MOD_VAL; //求出key /*判断在hash表中hash[key]存储的雪花是否与雪花i相同*/ for(vector<int>::size_type j = 0; j < hash[key].size(); j++) { /*若相同,则直接输出,并结束程序*/ if(isSame(hash[key][j], i)) { printf("%s/n", "Twin snowflakes found."); exit(0); } } /*若key相同的雪花没有一个与雪花i相同*/ hash[key].push_back(i); } /*若都不相同*/ printf("%s/n", "No two snowflakes are alike."); return 0; }
关于hash表的题目未完待续……
发表评论
-
虚函数、纯虚函数、虚基类、抽象类、虚函数继承、虚继承
2013-08-29 14:34 857虚函数:虚函数是C++中用于实现多态(polymorphis ... -
排序算法总结
2013-05-17 11:00 856选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法, ... -
poj 3122
2012-12-11 19:51 886题意:作者要开一个生日party,他现在拥有n块高度都为1 ... -
poj 3273
2012-12-11 16:49 1000题意:给你天数n,和每天需要花的钱,让你把这些天分成m份(每份 ... -
字典树学习材料
2012-05-30 14:29 983字典树,又称单词查找树,Trie树,是一种树形结构,典型应 ... -
poj 1159
2012-05-28 19:08 1465题目大意:给你一段字符串,让你求出在中间最少加入几个字符 ... -
poj 3176
2012-05-28 14:47 1044大致题意: 输入一个n层的三角形,第i层有i个数,求从第 ... -
poj 1260
2012-05-28 09:54 1630题意解释: 有n个等级的珠宝,等级依次升高,等级越高价钱越高 ... -
poj 1836
2012-05-28 09:22 2732是POJ2533的扩展题。题意不难,令到原队列 ... -
poj 2533
2012-05-26 15:36 1290在做这道题目之前,首先让我们了解一下什么是LIS算法,LIS俗 ... -
poj 3267
2012-05-26 09:43 818从程序可以看出,第i个位置到L所删除的字符数,总是先取最坏情况 ... -
poj 1276
2012-05-25 16:20 2422题意: 这道题的意思是给你一堆钱,各种面值的都有,比 ... -
poj 1094
2012-05-25 13:54 1126题意:给出字母个数,和有限个有序对(a<b)求出能确定字 ... -
poj 3393
2012-05-23 17:00 1272大致题意: 科普文一篇,文章80%都是无用信息,因为 ... -
poj 3007
2012-05-14 10:21 1004大致题意: 给定一个字符串,从任意位置把它切为两半, ... -
poj 3096
2012-05-10 21:09 1034题意: 定义D-pairs表示取字符串s中相距为D的两个字母 ... -
poj 1426
2012-04-26 20:11 2181大致题意: 给出一个整数n,(1 <= n <= ... -
poj 1797
2012-04-24 15:05 1637题目大意是就是何处一个图,n个顶点和m条边,每个边都有最大承载 ... -
poj 1338
2012-04-23 10:20 1272题意:题目意思是求由2,3,5的乘积组成的数从大到小排列,从1 ... -
poj 2021
2012-04-19 15:00 966题意:Ted今年100岁,给出n对他家族的关系:“父 ...
相关推荐
3. **哈希表**:用于快速查找和存储,如Hash函数的设计(poj3349, poj3274, POJ2151, poj1840, poj2002, poj2503)。 4. **字符串处理**:Trie树(前缀树)的应用(poj2513)。 ### 四、数学算法 1. **数论**:...
例如,题目poj3349和poj3274就涉及到哈希表的应用。 ### 4. 动态规划 动态规划是一种解决多阶段决策问题的方法,通过存储子问题的解来避免重复计算,达到优化的效果。动态规划题目通常要求求解最优解,例如背包...
- POJ 3349、POJ 3274:字符串匹配及Hash应用。 - POJ 2151、POJ 1840:利用Hash进行快速查询。 - POJ 2002、POJ 2503:Hash表在实际问题中的运用。 ### 搜索算法 #### 深度优先搜索 (DFS) - **题目示例**: -...
标题中的"POJ1002-487-3279【Hash+Qsort】"是指一个编程挑战题目,通常在在线编程平台上出现,比如北京大学的Peking Online Judge (POJ)。这个题目结合了哈希表(Hash)和快速排序(Qsort)两种算法来解决问题。哈希...
本人的一些poj基础训练题,主要包括图论,大数,二叉搜索,DP,搜索,hash等内容的入门题的ac源代码,代码风格容易模仿,适合acm入门级爱好者,题目涵盖范围对于入门者大约需要3至6个月左右的学习时间(有acm参加...
### 第九类:快速查找(B-Search, Hash and soon) #### 重要性: 快速查找技术如二分查找、哈希等,在数据结构和算法中占有重要地位,能够大大提高程序效率。 #### 题目示例及解析: - **2503** 和 **2513** 两题...
《多种解题技巧在POJ1035_Spelling Checker中的应用》 在编程竞赛领域,ACM(国际大学生程序设计竞赛)是一项备受瞩目的赛事,它要求参赛者在有限的时间内解决一系列复杂的算法问题。POJ(Problemset Online Judge...
1. **数据结构选择**:为了有效地存储和处理数据,我们可以考虑使用哈希表(Hash Table)或者计数排序(Counting Sort)。哈希表允许我们在常数时间内完成查找和更新操作,而计数排序则可以直接得到每个元素的出现...
- **题目**: 如`poj3349`、`poj3274`等。 - **所需知识**: Hash表的使用、平衡树的维护、Trie树的操作等高级数据结构的设计与应用。 ### 三、数据结构 #### 1. 树形结构 - **题目**: 如`poj2488`、`poj3083`等。 ...
这是另一个哈希模板题,可以通过哈希函数,如BKDRHash,对字符串进行快速的唯一性判断。C++中的STL库中的map也可以用于此目的,但哈希表通常提供更快的查找速度。Trie字典树也是解决这类问题的一种选择,但对于较大...
1. poj3096、poj3007、poj3393、poj1472、poj3371、poj1027、poj2706 2. poj1201、poj2983、poj2516、poj2516、poj2195 3. poj2942、poj2186、poj3352 4. poj2528、poj2828、poj2777、poj2886、poj2750 通过学习和...
ļɺŻ(poj3411,poj1724) - **POJ 3411**: 可能涉及到的是广度优先搜索(Breadth First Search, BFS)。这类题目通常需要遍历所有可能的状态,并寻找最优解。 - **POJ 1724**: 同样有可能是关于BFS的应用。这类...
4. **22Hash.ppt** - 散列表(哈希表)是一种通过散列函数实现快速存取的数据结构。PPT可能讨论了冲突解决策略(开放寻址法、链地址法、再哈希法等)、负载因子以及散列表的平均查找时间。 5. **14_1最短路I.ppt & ...
例如,poj题目中的模拟题、差分约束系统、最小费用最大流、双连通分量等,都提供了实际应用这些算法的机会。 总的来说,理解和熟练掌握这些算法和数据结构对于成为一位优秀的计算机科学家或工程师至关重要,它们是...
- 集合维护问题,例如POJ的食物链问题。 - 树上统计问题,如求树中任意两点间的距离。 #### 四、总结 通过对以上数据结构的总结,我们可以看到每种数据结构都有其独特的优势和应用场景。在实际开发和算法设计中...
在学习这些算法时,建议通过实际编程练习来加深理解,可以尝试解决POJ等在线编程平台上的题目,如poj3096、poj3007等。同时,理解并熟练应用C++标准模板库,这将有助于提高编程效率和解决问题的能力。
POJ(Peking University Online Judge)是一个广受欢迎的在线裁判系统,提供大量的算法题目供参赛者练习。 **重要性:** - **理解比赛规则:** 对于ACM竞赛的基本规则、评分标准等有基本了解。 - **掌握基础算法:*...
以题目poj2064和hdu1964为例,这两个题目都涉及到哈密顿回路问题,即寻找一条经过所有顶点恰好一次且最终回到起点的路径。在这个问题中,我们可以将二进制掩码看作是一个状态集合,其中每个位代表一个顶点是否已经被...
1.7 字符串 hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2 数学 25 2.1 素数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25...