HDU
文章平均质量分 55
今天没吃药
这个作者很懒,什么都没留下…
展开
-
HDU5586 - Sum (最大子列和)
题目链接思路代码思路将数组处理一下,保存变化后和变化的差值。 这样的话,正数代表有益,负数代表无益,这样对整个数组进行一次遍历,就可以得到最大获益的变化。代码#include <iostream>#include <cstdlib>#include <cstdio>using namespace std;typedef long long ll;int num[1000100];int原创 2015-12-08 12:33:24 · 438 阅读 · 0 评论 -
HDU5437 - Alisha’s Party (优先队列 模拟)
题目链接思路按照题目要求,利用优先队列进行模拟。需要注意的就是可能有多个数据是同一时间,按照能进入的最大人数计算,不能累加,所有操作完成后,剩下的人还要按照礼物大小来依次全部进入。 刚开始做的时候,觉得直接用优先队列,可能会超时,还自己写了一个二叉堆,不过提交时发现并没有什么改善,估计是自己写的太烂了,还不如直接用C++里边的……代码#include <iostream>#include <cs原创 2015-09-29 18:27:01 · 405 阅读 · 0 评论 -
HDU2067 - 小兔的棋盘 (递推)
题目链接思路代码思路一道递推题(或者说有点DP的感觉)。 看网上有人说是卡特兰数,不过对那个不是很熟悉,也就没有用。代码#include <cstdio>using namespace std;typedef long long LL;LL sta[40][40];int main(){ sta[0][0] = 1; for(int i=1; i<=35; i++)原创 2015-09-09 21:15:45 · 427 阅读 · 0 评论 -
HDU1025 - Constructing Roads In JGShining's Kingdom (最长上升子序列)
题目链接思路代码思路这道题看上去就让人头大,但是仔细分析下。题目要求不能有交叉,例如 poor1poor1 对应 rich4rich4,那么 poor2poor2 对应 rich5rich5 及以后才算满足条件, poor3poor3 就要对应 poor2poor2 对应 richrich 的后面…… 其实就是将一列作为下标,在另一列里边找最长上升子序列的问题。PS:二分写起来太难受了,各种边原创 2015-09-01 23:10:43 · 306 阅读 · 0 评论 -
HDU1425 - sort (简单题)
题目链接思路代码思路水题,可以直接用 sort 过。另一种思路就是:因为题中的数据是不重复的,且数据较少,所以直接开一个数组,将对应的位置设置为真,然后从后往前输出即可,也是比较慢的,但也是一种思路。代码#include <cstdio>#include <cstring>using namespace std;bool num[1000100];int main(){ int n原创 2015-09-08 17:13:12 · 711 阅读 · 0 评论 -
HDU5428 - The Factor (因式分解)
题目链接思路代码思路解法就是找到所有的数的因子中的最小的两个(除过 1)的乘积,我是直接做的。如果有一个大的质数,就会了浪费很多的时间,所以超时了。比赛的时候就被 hack 了。 应该有快速的分解因子的方法,或者可以用大数判素数来直接将非常的数进行排除。比赛的时候脑子短路了,从 1 到 n 去验证,所以如果有一个比较大的质数,就会十分耗时。 这样做其实是没有必要的,顶多枚举到 sqrt(n) 就原创 2015-09-07 20:15:27 · 360 阅读 · 0 评论 -
HDU1053 - Entropy (哈夫曼树)
题目链接思路代码思路纯数据结构。代码#include <iostream>#include <cstdio>#include <map>#include <queue>#include <cstring>using namespace std;struct node{ char ch; int num; int ls, rs;} tree[100];stru原创 2015-09-07 21:55:03 · 539 阅读 · 0 评论 -
HDU1050 - Moving Tables (贪心)
题目链接思路代码思路贪心,两个操作如果有重叠,就一定不会同时进行,两者以任何顺序操作都不会影响到整体的时间。 所以每次操作时,任取一个并且将可以和他同时进行的操作一次完成,直到全部执行为止。在执行完一个操作后,假如下一个操作并没有和其他操作冲突,那执行必然对整体有利,假如有两个(多个)操作重叠,他们几个肯定不可能同时进行,所以任取一个都可以保证整体最优。 对于这道题还有应该需要注意的一点,这道原创 2015-09-07 20:33:52 · 548 阅读 · 0 评论 -
HDU1047 - Integer Inquiry (大数加法)
题目链接思路代码思路大数加法,这道题的格式一直没控制好,PE了好长时间。代码#include <iostream>#include <cstring>#include <algorithm>using namespace std;char ans[110];char num[110];void reverse(char *str){ int len = strlen(str);原创 2015-09-06 17:06:27 · 716 阅读 · 0 评论 -
HDU1049 - Climbing Worm (模拟)
题目链接思路代码思路因为最后一次不用下滑,所以我们模拟到 deep−updeep-up 就可以停止了。代码#include <cstdio>using namespace std;int main(){ int deep, up, down; while(scanf("%d%d%d", &deep, &up, &down)&&deep) { for(int原创 2015-09-06 23:18:51 · 392 阅读 · 0 评论 -
HDU1048 - The Hardest Problem Ever (简单题)
题目链接思路代码思路一道简单的入门题,列出表,然后输入输出就行。不过最开始智商被压制了,漏掉了字母 DD, WA 到哭。代码#include <cstring>#include <cstdio>using namespace std;int main(){ char table[250]; char text[1000]; table[0] = '\n'; fo原创 2015-09-06 19:03:01 · 420 阅读 · 0 评论 -
HDU5427 - A problem of sorting (简单题)
题目链接思路代码思路简单题, 给姓名和生日的组合, 让按照年龄的大小输出。 不过姓名可能中间有空格,因为生日是一行的后4位,所以直接读一行,然后在生日前截断,排序就行。代码#include <cstring>#include <algorithm>#include <cstdio>using namespace std;struct node{ char name[110];原创 2015-09-06 20:26:19 · 968 阅读 · 0 评论 -
HDU1241 - Oil Deposits (深搜)
题目链接思路dfs求联通块。代码#include <iostream>#include <cstdio>using namespace std;const int maxn = 100;int n, m;int xx[] = {0, 1, 1, 1, 0, -1, -1, -1};int yy[] = {1, 1, 0, -1, -1, -1, 0, 1};bool maze[maxn]原创 2015-10-15 23:54:11 · 365 阅读 · 0 评论 -
HDU5444 - Elven Postman (树的遍历)
题目链接思路按照二叉搜索树的建树规则,将输入的数据构建成树,然后遍历就行代码#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 1000;int tree[maxn+10];int ls[maxn+10];int rs[maxn+10];int nCoun原创 2015-10-07 23:50:32 · 328 阅读 · 0 评论 -
HDU5510 - Bazinga (kmp+暴力)
题目链接思路给一列字符串,对于第 i 个字符串来说,只要之前所有的字符串中有不是他的子串的,就算成功,求最大的 i。枚举 i ,去匹配之后所有的 j (j>i),并对所得的信息进行记录。 假如 i 不是 j的子串,即成功。那么后面所有的 i‘ 就不用再去尝试 j 了。 假如 i 是 j 的子串,那么 j 就拥有它的所有信息,可以知道在后面的匹配中,j 能匹配成功,则 i 也能匹配成功,原创 2015-12-08 12:35:16 · 446 阅读 · 2 评论 -
HDU5591 - ZYB's Game (简单博弈)
题目链接思路代码思路一个数,两个人去猜,先猜到的人输。 这个题目抽象一下,就可以理解为,有一根棍子,中间有一个宝物,每个人可以依次从两端切去一部分,先切到的人输。当出现1 0 1的情况的时候,是后手必赢得。怎样才能得到这样的结果呢,分析可知,先破坏两边长度平衡的会输,因为后手可以对应的在另一边制造平衡,就会出现最简单的那种情况。要想让后手赢,就要让先手破环平衡,很显然只有当最开始的时候就是平原创 2015-12-08 12:36:52 · 807 阅读 · 1 评论 -
HDU1015 - Safecracker (深搜)
题目链接思路代码思路这道题的题意刚开始理解错了,以为每一个字母的权重是所给字符串中的顺序(论英语的重要性)。每个字母的权重还是字母表中的权重,AA 还是 1 ZZ 还是 26 。他给的字符串的顺序就没有什么用,只是确定了哪些字符可选。相当于有五个空,把26个字母中的一部分逐个尝试填入。实际上就相当与5个for循环。又因为多种可能时,需要输出字典序最大的,所以只要在搜索时优先选择权值大的字母即可原创 2015-12-01 15:16:42 · 468 阅读 · 0 评论 -
HDU1253 - 胜利大逃亡 (广搜)
题目链接思路代码思路广搜,求最短路。这道题的数据让我有点无语,应该是路径相对来说比较单一。不需要指导函数来优化方向,用了优先队列和估价函数反而超时了(可能是浪费在各种操作和函数传递上面了吧,也有可能是我写题的方式不对)。 用普通的队列,再把各种函数调用也降到最低,才勉强过了。代码#include <iostream>#include <cstring>#include <cstdio>#原创 2015-12-01 15:01:33 · 340 阅读 · 0 评论 -
HDU1010 - Tempter of the Bone (搜索+剪枝)
题目链接 : HDU1010 - Tempter of the Bone思路代码思路在最基本的走迷宫上加了一个固定步数的限制。在原先的代码中并不需要太多的改变,将成功推出条件更改一下。将这个表格,从上到下,从左到右填入数字 1,2,3……。观察就会发现,奇到奇,偶倒偶都需要偶数步,否则需要奇数步,这样的话就可以在搜索前加上一个判断。如果不符合这个条件的话,就是完全不可能的。这样进行剪枝后,还是原创 2015-10-15 18:03:08 · 335 阅读 · 0 评论 -
HDU1240 - Asteroids! (广搜)
题目链接思路将普通的迷宫最短路推广到三维,数据量比较小,思路和步骤与二维迷宫求最短路一致。 不过在加一个坐标,对于这道题来说,需要注意的是坐标的表示方式,题中的坐标为列行层。POJ2225 同样的题代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;struct原创 2015-10-15 23:55:15 · 504 阅读 · 0 评论 -
HDU1232-畅通工程 (并查集)
题目链接思路并查集,n个节点最少需要建设n-1条边,每有一个连接不同集合的边出现,所需建设的路就少一条。代码#include <cstdio>#include <cstring>using namespace std;const int maxn = 1000;int par[maxn+10];int get_par(int a){ if(par[a]<0) return a;原创 2015-10-08 00:29:24 · 268 阅读 · 0 评论 -
HDU1556 - Color the ball (线段树超时 利用数组解决)
题目链接思路看上去就是一道简单的线段树的应用,区间更新,单点查询,但直接做却超时了。 找优化方法的时候得到了另一种方法,利用数组来进行解决。 我们都知道如果只解决区间求和问题的时候,可以直接对数组进行处理, 处理for(int i=1; i<=n; i++) ans[i] += ans[i-1];查询result = ans[right] - ans[left-1];同样的,如果我们要对区间原创 2015-10-07 23:53:53 · 480 阅读 · 0 评论 -
HDU5443 - The Water Problem (线段树)
题目链接思路线段树的应用,可是因为数据量太小,可以直接暴力代码#include <iostream>#include <cstdio>#define lson tree[root].ls#define rson tree[root].rsusing namespace std;const int maxn = 1000;struct node{ int ans; int原创 2015-10-07 23:49:59 · 525 阅读 · 0 评论 -
HDU1698 - Just a Hook (线段树 区间更新)
HDU1698 - Just a Hook (线段树 区间更新)题目链接思路线段树的应用,区间更新(不用更新到底,更新到终止节点就行,查询时再将所涉及的节点信息push_down下来),颜色的数量用一个数组记录下来就行代码#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#define lson t原创 2015-10-07 23:52:15 · 403 阅读 · 0 评论 -
HDU1754 - I Hate It (基础线段树)
题目链接思路线段树的基本应用,区间查询,单点更新代码#include <algorithm>#include <iostream>#include <cstdlib>#include <cstdio>#define lson tree[root].ls#define rson tree[root].rsusing namespace std;const int maxn = 200000原创 2015-10-07 23:48:09 · 280 阅读 · 0 评论 -
HDU1039 - Easier Done Than Said? (简单题)
题目链接思路代码思路题目要求按照3个标准来验证密码是否合格。所以遍历一遍字符串,看是否满足就可以了,这一类题的题意都很简单,就是要细心,考虑到一些边界特殊情况什么的。细节见代码……代码#include <cstdio>#include <cstring>using namespace std;char str[1000];int main(){ bool vowel[130];原创 2015-09-04 17:05:52 · 395 阅读 · 0 评论 -
HDU1045 - Fire Net (深搜)
题目链接思路代码思路这道题其实是一道很经典的二分图匹配问题,在我看了后准备放弃的时候,发现这道题的数据量最大是 4 ,所以这就给我们暴搜提供了可能。最多只有16个方块,所以直接从第一个开始枚举,以后的每一步都分两种情况,放和不放,在最后出界的时候记录一下最大值就行了。具体实现见代码代码#include <cstdio>#include <algorithm>using namespace std原创 2015-09-05 23:56:14 · 356 阅读 · 0 评论 -
HDU1040 - As Easy As A+B (简单题)
题目链接思路代码思路水题代码#include <algorithm>#include <cstdio>using namespace std;int num[1010];int main(){ int t, n; scanf("%d", &t); while(t--) { scanf("%d", &n); for(int i=0原创 2015-09-04 17:14:08 · 280 阅读 · 0 评论 -
HDU1013 - Digital Roots (模拟)
题目链接思路代码利用定理代码思路求解数字根,要注意的是数据是大数,需要处理。或者根据定理来进行求解。代码#include <iostream>#include <cstdio>#include <cstring>using namespace std;int main(){ int num, ans; char str[1000]; while(scanf("%s原创 2015-08-31 15:38:22 · 983 阅读 · 0 评论 -
HDU1027 - Ignatius and the Princess II (深搜)
题目链接思路代码思路要想得到的数字最小,那么小的数字就应该在前面,按照小的数字先进行访问的规则得到的第 mm 个数字就是第 mm 小的。具体细节看代码。代码#include <cstdio>#include <cstring>using namespace std;int num[1010], maxn, m, count;bool vis[1010], flag;void dfs(int原创 2015-09-02 14:35:32 · 393 阅读 · 0 评论 -
HDU1034 - Candy Sharing Game (简单模拟)
题目链接思路代码思路 这道题是一道简单的模拟题,按照题目要求走一遍就行了,注意理解题意。代码#include <cstdio>using namespace std;int candy[10000];int main(){ int n, i; while(scanf("%d", &n)&&n) { for(i=1; i<=n; i++) scanf("%原创 2015-09-04 12:30:53 · 672 阅读 · 0 评论 -
HDU1031 - Design T-Shirt (水题 模拟)
题目链接思路代码思路水题,不过他的这个题意描述的让人很头疼,像我这种英语差的,半天都没看懂题意。 就是有 n 个人给 m 个东西打分, 选出分最高的 k 个,相同分数序号越小,排名越前。然后输出的时候按照序号从大到小输出。例如: 3 3 2 1 2 3 2 3 1 3 1 23~ 3~ 2 \ 1~ 2 ~3 \ 2~ 3~ 1 \ 3~ 1~ 2 33 个人给 33 个东西原创 2015-09-03 01:30:33 · 428 阅读 · 0 评论 -
HDU1019 - Least Common Multiple (LCM的简单应用)
此处输入链接的描述思路代码思路一次求出所有数的最小公倍数就行了, a∗b=gcd(a,b)∗lcm(a,b) a * b = gcd(a, b)*lcm(a, b)。注意用 long long 小心溢出。代码#include <cstdio>using namespace std;typedef long long LL;LL gcd(LL a, LL b){ return b ==原创 2015-08-31 17:43:59 · 265 阅读 · 0 评论 -
HDU1022 - Train Problem I (模拟)
题目链接思路代码思路按照他所说的规则,模拟一遍,用一个栈作为媒介。代码#include <cstdio>#include <vector>#include <string>#include <stack>using namespace std;char A[10];char B[10];int main(){ int len, a, b; vector<string>原创 2015-09-01 16:31:11 · 283 阅读 · 0 评论 -
HDU1003 - Max Sum (最大连续子串和)
解题思路代码题目链接: HDU1003 - Max Sum解题思路最大连续字段和,方法很多,这里用一种 在线更新 的做法。 每读进来一个数,就与当前进行加和,并更新最大值信息,若和值小于 0 , 再从头开始。 其他方法也可以做(动规的思路),对这道题来说,需要注意的是 全负 的情况。代码#include <iostream>#include <cstdio>using namespace s原创 2015-08-30 01:42:19 · 484 阅读 · 0 评论 -
HDU1005 - Number Sequence (矩阵快速幂)
题目链接: HDU1005 - Number Sequence思路代码思路类似斐波那契数列的推导式,但是所求 n 太大,所以用了矩阵快速幂(不了解矩阵快速幂的点我 )。 有人做好像是有周期可循的, 但还是矩阵快速幂来的简单暴力。代码#include <cstdio>#include <cstdlib>using namespace std;const int mod = 7;struct原创 2015-08-30 01:50:12 · 677 阅读 · 0 评论 -
HDU1016 - Prime Ring Problem (简单搜索)
题目链接思路代码思路这是一道简单的搜索题,简单说就是一位一位去试,一位一位地填上数字,看是否满足条件,具体看注释。代码#include <cstring>#include <cstdio>using namespace std;// 素数表,数据较小直接打表也可以bool prime[41];void init(){ memset(prime, true, sizeof(prime原创 2015-08-31 15:25:42 · 324 阅读 · 0 评论 -
HDU1020 - Encoding (模拟)
题目链接思路代码思路这道题刚开始一直没读懂题意,读懂题意就很好做了,他是将相同的字符转化成数字+字母。例如 ABBAABBA 变成 A2BAA2BA 。代码#include <cstdio>#include <cstring>using namespace std;char text[10010];int main(){ int n, count; scanf("%d",原创 2015-09-01 14:21:32 · 235 阅读 · 0 评论 -
HDU1021 - Fibonacci Again (水题 找规律)
题目链接思路代码思路打表,算出所有的 fibfib 数(可以直接算,也可以用矩阵快速幂),然后依次输出就行,数列的每一位需要对 33 取余,否则会溢出。 另一种方法是,打表时很容易就会发现规律。 代码// 规律#include <cstdio>using namespace std;int main(){ int num; while(scanf("%d", &num)=原创 2015-09-01 15:55:16 · 321 阅读 · 0 评论 -
HDU1061 - Rightmost Digit (二分幂取模)
题目链接思路代码思路需要取出 NNN^N 的最后一位,就相当与对 1010 取模。二分幂取模实际上就是利用分治的思想。nn=n(n/2)∗n(n/2)n^n=n^{(n/2)}*n^{(n/2)}, 如果 n&1==1n\&1==1 还需要再乘上一个 n。代码#include <cstdio>#include <cmath>using namespace std;int pow_mod(int原创 2015-09-08 16:41:15 · 451 阅读 · 0 评论