ACM
cbsheng
这个作者很懒,什么都没留下…
展开
-
acm 常用数据结构与算法专题(未分类均放于此)
并查集:hdu 1232 简单入门第 K 大问题:hdu 1280 简单题,数据很水,可直接用计数排序解题Manacher 算法:HDU 3294 简单题Trie 树:入门题: POJ 2001 POJ 2530 POJ 3630 POJ 1056区间树(线段树):HDU 1166 单点更新 HDU 1754 单点更新 HDU 1394 单点更新,求多排列的最小逆序对数数论:CF LCM原创 2015-06-28 21:52:28 · 1800 阅读 · 0 评论 -
hdu_2040_亲和数_解题报告
题目出处简单题思路:首先你得知道什么亲和数, 了解清楚之后,那就用最直接的想法解题:分别对两个数求出各自所有的真约数,然后相加对比关键代码:// 返回1是YES, 反之是NOint fun(long a, long b){ int i; long asum = 1, bsum = 1; long temp = a > b ? a/2 :原创 2013-04-24 22:19:07 · 1060 阅读 · 1 评论 -
HDU 5272 解题报告
这是一道 bestcoder round45 的1001题。 简单题,找出二进制中连续的1有多少个就可以了。代码链接:HDU 5272原创 2015-06-21 11:01:01 · 1523 阅读 · 0 评论 -
hdu_2030_汉字统计_解题报告
题目出处简单题思路:题目已有提示([Hint:]从汉字机内码的特点考虑~)因为当系统中同时存在ASCII码和汉字国标码时,将会产生二义性。所以为了消除这二义性,就需要进行一些处理:汉字机内码 = 汉字国标码 + 8080H意思就是把国标码的每个字节最高位置1这样做的效果,就会使到单个字节变成负数。所以此题的解法只需判断是否为负数即可关键代码:char原创 2013-04-01 21:58:05 · 1035 阅读 · 0 评论 -
hdu_2002_计算球体积_解题报告
题目出处简单题思路:与hdu2001一样,套公式即可r:球体的半径关键代码:#define PI 3.1415927result = 4.0 / 3.0 * PI * pow(r, 3);printf("%.3f\n", result);原创 2013-04-04 10:45:53 · 1585 阅读 · 0 评论 -
HDU 2046 解题报告
这是一题简单的递推题,可以用 dp 解题。递推公式: F(i) = F(i-1) + F(i-2)需要注意这题50时会爆 int。所以用__int64代码链接:HDU 2046原创 2015-05-19 15:55:13 · 914 阅读 · 0 评论 -
UVA 400 解题报告
题目意思: 就是输出 input 里面的文件名。 文件名直接排序即可,没难度。 这题难在输出。要注意,ls 的输出是怎么样。我就在这里 wa 了好几次,怎么想要不明白,后面才发现我理解的输出形式与 ls 的不一样的。 ls 的输出形式是:从左至右,从上到下的升序输出。代码链接:UVA 400原创 2015-04-26 23:57:40 · 1080 阅读 · 0 评论 -
hdu_Lowest Common Multiple Plus_解题报告
题目出处简单题思路:求 最小公倍数,有其公式可用 (出处)就是 最小公倍数 = |a * b| 除以 (a与b的最大公约数)此题的问题就转化为如何求 最大公约数 同样, 最大公约数 也是用欧几里得算法(辗转相除法)例如(出处)计算a = 1071和b = 462的最大公约数的过程如下:从1071中不断减去462直到小于46原创 2013-03-31 19:28:29 · 1046 阅读 · 0 评论 -
hdu_2031_进制转换_解题报告
题目出处简单题思路:将十进制的32位整数转换成其他进制,这个可以用余数定理,关于进制转换的文章谷歌一下已很多,这里不详述此题解法可以采用最简单最直接想到的方法,就是保存转换后的数,再倒序输出,可以利用打表技巧输出:char table[] = "0123456789ABCDEF";另一个解法就是用栈,前几次的计算的结果不输出,压栈,直到最后的数为零时终止并向上返回,这原创 2013-04-03 10:27:28 · 1104 阅读 · 0 评论 -
hdu_2033_人见人爱A+B_解题报告
题目出处简单题思路:就是两个时间的叠加,注意 分 和 秒 需要满60进1,而 时 是不断叠加上去的所以解法就着重在 分 和 秒 的处理,用 / 和 % 运算符即可关键代码:am += bm, as += bs, ah += bh;am += as / 60;as = (as % 60);ah += am / 60;am = (am % 60);原创 2013-04-04 16:48:06 · 1416 阅读 · 0 评论 -
HDU 2602 解题报告
题目意思: 这是一道无变型的经典基础01背包问题。递推公式: F(i, j) : i 个骨头, j 的体积限制时的背包的最大价值 V[i] : 第 i 个骨头的体积 N[i] :第 i 个骨头的价值 F(i, j) = max{F(i-1, j), F(i-1, j-V[i]) + N[i]}注意这题的数据会有骨头体积为0却有价值的情况。代码链接:HDU 2602原创 2015-05-18 07:51:47 · 796 阅读 · 0 评论 -
poj_1068_Parencodings_解题报告
题目出处题意:对于字符串S有两种编码方式:1. P-sequence:当遇到右括号时,记录下当前左边的所有左括号 2. W-sequence: 当遇到右括号时,记录下与当前右括号匹配的左括号内的右括号数,并包括自己解法:模拟思路:用了最简单直接的方法,首先将P-sequence编码转换为原始字符串S,再由原始字符串S转换为W-sequence编码此题解法有待日后优原创 2013-01-25 20:36:20 · 891 阅读 · 0 评论 -
hdu_2000_ASCII码排序_解题报告
题目出处简单题思路:题目要求是从小到大,即升序排列解决此题可以自己写排序函数,但是我觉得这里用库函数会更好,而且对于初学者而言,也要懂得灵活运用库函数这里使用了 C标准库的qsort()关键代码:int cmp(const void *a, const void *b){ return *(char*)a > *(char*)b ? 1 : 0;}原创 2013-04-02 14:17:20 · 926 阅读 · 0 评论 -
hdu_2004_成绩转换_解题报告
题目出处简单题思路:这题应该是学习后C的 switch 或 if-else-if 语法后经常做的题目类型所以此题用上述两种分支语句都能解题,而初学者可能多数这样做:if (input > 100 || input < 0){ printf("Score is error!\n");}else if (input >= 90 && input <= 100) print原创 2013-04-04 11:04:49 · 1196 阅读 · 0 评论 -
HDU 1025 解题报告
这是一道 LIS (最长升序子序列)的问题。 这题是不需要考虑元素重复的情况。 数据比较大,需要用 O(nlogn)才能解题。 注意输出有 load和 loads 的坑。。。代码链接:HDU 1025原创 2015-05-22 23:19:01 · 1638 阅读 · 0 评论 -
hdu_2001_计算两点间的距离_解题报告
题目出处简单题思路:很简单,直接套用数学公式就行了 (出处)对于数学公式中的平方和开方,C标准库(math.h)同样的提供了数学函数 pow() 和 sqrt()关键代码:result = sqrt(pow((x1-x2), 2) + pow((y1-y2), 2)); printf("%.2f\n", result);原创 2013-04-02 14:25:35 · 1595 阅读 · 0 评论 -
hdu_Palindromes _easy version_解题报告
题目出处简单题思路:回文串题。这里有一篇是用递归解回文串。当然可以用循环解题关键代码:int len = strlen(str);for (i = 0; i < len / 2; i++) { if (str[i] != str[len - 1 - i]) { // do something }}原创 2013-03-31 19:13:13 · 1075 阅读 · 0 评论 -
poj_2255_Tree Recovery_解题报告
题目出处题意:输入两组数据,分别是前序遍历序列和中序遍历序列,你需要编写程序通过这两组数据求出该树的后序遍历序列(前序序列 + 中序序列 = 后序序列)解法:递归题目分析:可以先按照用笔和纸的形式去推导出后序序列。推导过程省略,在推导过程中我们会发现规律:假设 前序序列是 A B E H F C G I 中序序列是 H E B F A C I G (图如下)每一原创 2013-01-22 15:49:44 · 5152 阅读 · 1 评论 -
POJ 3264 解题报告 RMQ 问题 ST算法
这道题可以用线段树、树状数组解决,也可以用 ST 算法。题目意思很明显,最大值-最小值就是结果。第一道用 ST 解决的题目。//ST 算法#include #include #define MAXN (50000 + 10)int cows[MAXN];int st_max[MAXN][20];int st_min[MAXN][20];int n, q, l,原创 2015-07-17 15:58:09 · 1924 阅读 · 0 评论 -
Codeforces Round #146 (Div. 1) LCM Challenge 解题报告 数论 找规律
题目链接:http://codeforces.com/problemset/problem/235/A题目意思:找出三个小于 n 的数,这三个数组成的 LCM(最小公倍数)是最大的。首先,这三个数应该是互质的。根据 LCM 的公式 (a * b) / gcd(a,b),gcd(a,b)为1时,即互质,LCM 值是最大的。然后开始找规律:如果是奇数的话(n=7),那么原创 2015-07-16 11:32:34 · 1777 阅读 · 0 评论 -
HDU 1394 解题报告 线段树 单点更新
求逆序对常用方法是归并排序,当然线段树也可以解决,但是空间复杂度就会更大。这题两者都可用。因为只需要第一次求出逆序对数即可,后面的排列都可以推出来。具体怎么推?假设 sum 是第一次求出来的逆序对。 第一次排列是 1 3 6 9 0 8 5 7 4 2那么,第二次就会是3 6 9 0 8 5 7 4 2 11 被放到末尾,自然需要在 sum 上减去包括1原创 2015-07-16 19:37:36 · 1635 阅读 · 0 评论 -
DP 专题
hdu: 2046 骨牌铺方格 3485 Count 101poj: 1163 The Triangle原创 2015-05-19 16:02:20 · 544 阅读 · 0 评论 -
HDU 1166 解题报告 线段树
这是一题线段树的入门题,主要是点更新。编码用的是完全二叉树,即数组,用链表会超时。其次用 p #include #define maxn 50000//4倍大小是一个合适的值int ns[maxn * 4 + 100];int nums[maxn]; //完全二叉树存储区间树void build(int p, int l, int r){ if (l == r) {原创 2015-07-14 23:25:01 · 1590 阅读 · 0 评论 -
HDU 1754 解题报告 线段树 单点更新
线段树入门题,单点更新。每个结点存储两个孩子最大者即可。//线段树单点更新,完全二叉树解法#include #define MAXN 200000#define lson rt<<1#define rson rt<<1|1int top[MAXN * 4 + 100];int students[MAXN + 10];int k;void pushup(int rt){原创 2015-07-15 10:38:30 · 1541 阅读 · 0 评论 -
POJ 2001 解题报告 trie 树
题目意思:就是找能标识每个字符串自身的最短前缀。可以用 Trie 树解决,只需要记录每个结点的访问次数,那么每个字符串的最短前缀,要么就是到访问次数为1的那个字符结点为止的字符串,要么就是遍历完毕还没有遇到访问量为1的字符结点时,最短前缀就是自身。代码:POJ 2001#include #include #define maxn 1010typedef struc原创 2015-07-04 11:11:09 · 1495 阅读 · 0 评论 -
POJ 3630 解题报告 Trie 树
题目意思:如果某个 number 是另一个 number 的前缀,则 输出 NO。可以用 trie 树,这题有多组数据,要注意清零。代码:#include #include #define maxn 10000#define wlen 10 //number长度#define character '0'#define size 10 typedef str原创 2015-07-04 21:31:21 · 1541 阅读 · 0 评论 -
HDU 3294 解题报告 Manacher 算法
题目意思:对输入的字符串做两步处理,第一步先按要求转换。第二步在转换后的字符串中找出最长的回文子串。最长回文子串可以用 Manacher 算法解决。参考这篇原创 2015-07-03 16:10:09 · 1616 阅读 · 0 评论 -
POJ 2530 解题报告 trie 树
题目意思:给含有两个单词的映射关系的字典,然后查询接下来每个输入字符串的对应字符串。这题可以用 hash 或者 trie 树,都是入门级别。代码://这题是 trie 树 和 哈希 的入门题。#include #include #include #include #include #include using namespace std;#defi原创 2015-07-04 17:29:27 · 1611 阅读 · 0 评论 -
POJ 1056 解题报告 Trie 树
这题跟poj 3630一样,也是找前缀,数据更弱。代码:#include #include #define maxn 10#define wlen 10 //单词长度#define character '0'#define size 2 typedef struct node { int cnt; //记录访问量 int child_num; //记录孩子个数原创 2015-07-05 00:05:55 · 1554 阅读 · 0 评论 -
POJ 2846 解题报告 Trie 树变型
题目意思:给一个待查询的字符串,输出包含这个字符串(作为子串)的个数。数据量比较大,用 KMP 会超时。可以用 Trie 树,不过需要变型。正常的 Trie 树是以前缀开始的。在这题需要改成以后缀开始,后缀指以字符串每个字符作为开始直至结尾。例如字符串 abcdae ,各个后缀是 abcdae,bcdae,cdae,dae,ae,e。这样就很方便查询子串出现的次数了。但是要原创 2015-07-05 12:20:30 · 1501 阅读 · 0 评论 -
HDU 1280 解题报告 第 K 大
求第 K 大的一道题,题目意思很直白,数据也比较水,没有负数。所以可以直接用计数排序解决。代码:#include #define MMAX 5003#define NMAX 3000int count[MMAX * 2];int N[NMAX];int main(){ int n, m, max; while (scanf("%d %d", &n, &m) !=原创 2015-07-01 07:30:09 · 1391 阅读 · 0 评论 -
HDU 1232 解题报告 并查集入门
题目意思:能连通的城市放置到同一个集合中,最后输出集合的个数减一即可。原创 2015-06-28 21:49:02 · 1578 阅读 · 0 评论 -
poj_2389_Bull Math_解题报告
题目出处解法:简单模拟要点:数据的存储使用数组观察乘法的规律,就可以先相乘再相加进位注意:存储空间必须开大一点,不然就像我开始一样不断地WA,坑爹啊!代码:(先相乘完再进位)也可以把进位的代码放进每个数相乘的循环里#include using namespace std;const int MAX=40;const int result=原创 2012-11-26 15:49:37 · 730 阅读 · 0 评论 -
HDU Count 101 解题报告
题目意思: 找出所有不含有“101”子串的个数这题可以用 DP。 用 DP[i]代表长度为 i 时的不含有“101”子串的个数。 观察可以发现,DP[i] = 2*DP[i-1] - 以“10”结尾的 DP[i-1]个数。 而 以“10”结尾的 DP[i-1]个数 是 以“0”结尾的 DP[i-1]个数 减去 以“0”结尾的 DP[i-2]个数。 任意一个 DP[i],以“0”结尾的个数有原创 2015-06-14 21:32:46 · 1569 阅读 · 0 评论 -
UVA 644 解题报告
题目意思: 判断 set 里面是否有出现某个 code 是另一个 code 的前缀。 这题用 strncmp() 很好解决。注意点: 1. 输入的数据不会按照由小到大的。代码链接:UVA 644原创 2015-04-20 15:31:34 · 584 阅读 · 0 评论 -
UVA 120 解题报告
题目意思: 给出一序列。问需要翻转那些位置的元素能够使到序列变为升序。输出这些位置。最后加一个0.解法:每次取出下一个最大的数,如果这个数当前的位置是合法的,就 continue。否则就根据这个元素的位置进行选择翻转。代码链接:UVA 120原创 2015-04-24 10:47:09 · 1027 阅读 · 0 评论 -
UVA 409 解题报告
题目意思: 根据给的 keywords 在 excuses中找出匹配数最多的 excuse 输出注意点: 1. 如果有多个 excuse 需要输出,则顺序是按照输入的顺序。 2. keyword 在 excuse 中匹配时是大小写不敏感的。 3. 一个 keyword 在 excuse 中出现的次数是被累积的。代码链接:UVA 409原创 2015-04-20 12:33:26 · 458 阅读 · 0 评论 -
UVA 755 解题报告
题目意思: 找出重复的电话号码,并输出重复次数。用 c++的 map。打个字母到数字的映射。就可以直接粗暴地解决这题了。注意点: 1. 不同测试集中间的输出要加一空行。最后一个不需要。代码链接:UVA 755原创 2015-04-23 09:57:10 · 532 阅读 · 0 评论 -
UVA 156 解题报告
题目意思: 找出出现次数仅一次的字符串。用 C++的 map 也很方便解决这题。注意点: 1. 输出时候是大小写敏感的。 2. 两个字符串,只要所组成是一样的就意味着是相等的字符串。哪怕顺序不一样或分别是大小写。代码链接:UVA 156原创 2015-04-23 11:40:37 · 973 阅读 · 0 评论 -
UVA 537 解题报告
题目意思: 找出 P U I 中的任意两者,然后根据公式 P = U*I 计算结果。注意点: 1. (m, M, k) 和 (W, V, A)是相互组合的。就是会有 mW\MW\kW。。。 2. 输出要保留两位有效数字代码链接:UVA 537原创 2015-04-19 13:26:17 · 500 阅读 · 0 评论