
hdu
the_conquer_zzy
计算机科学与技术专业
展开
-
hdu 1030 求最短路径
总体思路是: m,n 两个数,始终保证,m是两者中较小的一个,这样就只有一种情况了, 从m,到达n, 只有往下走,到达n所在的行,并且,尽可能地离n较近,最后,计算到达n所在行时,m所在的位置,这道题的思路是这样的, 首先找到每行中每个数到达下一行的规律。然后 1 、 发现 奇数行,只有奇数可以直接一步到下一行,偶数行,只有偶数才能直接到下一行,并且对应的数字为 当前m 加上2 *m所在行。原创 2017-06-22 16:28:14 · 285 阅读 · 0 评论 -
hdu 1028带来的启示
hdu 1028这道题是我重新拾起acm来第一次,一次AC通过的题, 这道题背后的原理是母函数相关的内容,正确构造母函数式是关键,然后就是计算这个母函数。背后的原理是数学。原创 2017-06-18 17:35:33 · 297 阅读 · 0 评论 -
hdu 1015 带来的启示
这道题,我是用的5重循环过得, 前期WA主要错在,自己加一个判断,求出给出字母序列的最大值,最小值,然后出错了,发现没有必要手工构造就去掉了,然后就AC了。这道题带来的启示是另一种解法: 深度搜索 这种思路之前还不会,在此mark下。 当遇到循环过多无法使用循环时,采用此方法,思路就是dfs ,深度搜索,代码如下:原创 2017-06-11 11:01:52 · 317 阅读 · 0 评论 -
hdu 1010 Tempter of the Bone
这道题用到的方法是: DFS+奇偶剪枝+回溯 一般的DFS是不需要回溯的,仅仅做一个标记而已,但是这道题一个递归经历的,下次可以重用,所以需要回溯。 DFS深度优先遍历:就是循环+递归,循环是为了保证都能够有机会进行递归。递归就是深度有限的体现。回溯:回溯是指当前递归搜索路径不满足条件时,但是还有其他未搜索路径,存在满足条件的可能性,需要返回起点重新搜索(回溯)。由于可能和当前路径某些点重复,所原创 2017-06-08 01:15:51 · 338 阅读 · 0 评论 -
hdu 1008 elevator
#include <iostream>#include<cstdio>using namespace std;int cost(int a[],int len){ int time=0; for(int i=1;i<=len;i++){ if(a[i]-a[i-1]>0){ time+=(a[i]-a[i-1])*6; }else原创 2017-06-06 21:22:33 · 238 阅读 · 0 评论 -
关于hdu 1007 老是 TLE的认知
经过多次修改发现,同样的代码,把cin换成scanf就AC了,然后查找相关资料发现,,scanf效率比cin好的多,cout 比print 效率好。mark原创 2017-06-05 23:46:55 · 436 阅读 · 0 评论 -
hdu 1007 Quoit Design 解法
(本题属于算导最近点对例题。) 本文转载做学习用,不作其他用途题目描述 给出二维平面上的n个点,求其中最近的两个点的距离的一半。 输入包含多组数据,每组数据第一行为n,表示点的个数;接下来n行,每行一个点的坐标。当n为0时表示输入结束,每组数据输出一行,为最近的两个点的距离的一半。 输入样例: 2 0 0 1 1 2 1 1 1 1 3 -1.转载 2017-06-05 16:58:25 · 353 阅读 · 1 评论 -
分数化小数的解题思路
当求两个大数的和的时候,很容易想到模拟算术的基本过程:对齐相加。当分数化成小数的时候,需要指定保留的小数位数的时候,也可以模拟手工的除法过程,计算每一位商与余数实现准确的输出指定位小数。除法的过程:先上商,然后余数进行借位(本质是乘以10),核心代码: int n=a/b; int a=(a-n/b)*10;原创 2017-06-05 20:56:56 · 425 阅读 · 0 评论 -
hdu 1043带来的启示(二)
前面提到了康托展开式,主要是把对应排列的康托式作为数组下标,方便找到该排列。 核心思想:利用康托展开式,记录每个排列状态,从最终状态倒序BFS,中间记录到达的每一个排列的经过的步骤,完成搜索后,就把能到达的状态,写到了数组里。以及如何到达的也写到了数组里,直接进行查表就可以了。另外如果用string 类型记录路径会比较方便,但是耗费内存太大,会出现MLE,主要原因是string会开辟实际内存是长度原创 2017-07-06 22:10:22 · 283 阅读 · 0 评论 -
hdu 1067 Gap
这道题和hdu1043 Eight问题可以认为是同一类问题, 针对这道题,是手动实现的hash, 而Eight问题是利用康托展开式 ,康托数和排列一一对应本质还是hash这两道是典型的状态搜索题,这里纪念下 下面是ac代码,思路源于其他网友,这里借鉴#include<iostream>#include<queue>#include<cstring>#include<cstdio>usin原创 2017-07-16 21:32:37 · 299 阅读 · 0 评论 -
hdu 1068 Girls and Boys
这道题和hdu 1054同样是二分图匹配相关的问题。 二分图 最大匹配数=最小点覆盖数。DAG 最小路径覆盖=顶点数-最大匹配数最大独立集=顶点数-最大匹配数。当一个图是无向图时,需要从每一个顶点进行最大匹配查找,所以无向图的最大匹配数是求出的最大匹配数/2; 或者可以理解为: 当图是无向图时, 左边的集合是包含了所有的顶点, 是有向图时,只包含了一部分顶点。匈牙利算法: vector<i原创 2017-07-17 13:51:49 · 237 阅读 · 0 评论 -
二分图 hdu 1054 Strategic Game
这是个最小点覆盖问题,而最小点覆盖问题=二分图最大匹配数匈牙利算法是计算二分图最大匹配的算法:其dfs实现版本如下bool dfs(int v){ for(vector<int>::iterator it=tree[v].begin();it!=tree[v].end();it++){ int w=*it; //for if(!visited[原创 2017-07-13 22:54:22 · 226 阅读 · 0 评论 -
hdu 1011 starship troopers
这道题是一个树形 背包问题,或者说树形DP问题,房间的管道形成树。背包问题的特点: 最优子结构,可分解, 解决办法: 常见的有递归(自顶向下),搜索(自底向上),背包注意的问题,为什么要自底向上搜索????需要好好学习背包问题;#include <iostream>#include<vector>#include<cstdio>#include<cstring>using namespac原创 2017-06-09 17:01:53 · 259 阅读 · 0 评论 -
hdu 1025 最长子序列,lower_bound的使用,二分查找
这道题,我想的是dfs,毕竟我刚学会这个算法,后来,也想到要排序,那是我为了寻找剪枝条件,最后,找到这种解法,mark一下。 学到一个最长上升子序列的求解方法:利用二分查找。原创 2017-06-12 23:59:52 · 338 阅读 · 0 评论 -
hdu 1044带来的启示
核心思想 : 1. 先计算,入口,珠宝,出口,两两之间的最短距离,(最短距离肯定采用BFS),记录到数组中,dist[a][b],表示,a(可能是入口,珠宝,出口),到所有其他b(入口,珠宝,距离)点的距离; 2. 在入口,珠宝,出口之间再采用dfs,,把入口作为起点,依次dfs求出最大值,遍历到出口时,更新记录最大的珠宝值。#include <iostream>#include<cstdi原创 2017-07-07 20:30:57 · 337 阅读 · 0 评论 -
hdu 1046 技巧题
gridland ,当长宽都是奇数时,结果为n*m-1+sqrt(2) 否则为n*m,因为,可以看作是一个环,所以共有n*m个节点,n*m个节点构成的环自然长度为n*m#include <iostream>#include<cstdio>#include<cmath>using namespace std;double handle(int r,int c){ if(r%2&&c%原创 2017-07-07 20:33:48 · 334 阅读 · 0 评论 -
hdu 1114 Pig-bank
完全背包问题。 问题错在memset的使用上,const int INF=100000;memset(dp,INF,sizeof(dp));并不能把数组dp全部赋值为INFmemset是按字节复制,所以,一般可以进行数组的赋0 操作,否则不要使用memset进行赋值,而是老实的使用循环。完全背包核心代码: for(int i=0;i<N;i++){ for(int j=w[i];j<原创 2017-07-30 23:05:34 · 290 阅读 · 0 评论 -
hdu 1133
这题和卡特兰数很像。但是是组合数学,和大数的问题。 如果m=n 则是卡特兰数 这题需要用组合数学考虑。 n>m 为0 很容易得到 m+n 个人排队,总的排队是 C(m+n,n) 最后再乘以 m! 和n!. 用0表示拿50元的人,1表示100元的人。 则排队方式是 m个0 和n个1 的组合, 再乘以m!n!. 对于会停止的排队方式,也就是非法方式是:m每个0,n个1 的非法排队原创 2017-08-07 17:57:11 · 244 阅读 · 0 评论 -
hdu 1074 doing homework
状态压缩dp 首先进行状态映射,(状态压缩),一共有15门课,每门课则可用一个数字位 来表示这门课作业是否已经做完,比如3门课 001,表示完成了第一门课作业,101,表示完成了第1门,第 3门作业。 则需要一个0-15位整数范围的数来表示所有状态 初始状态000, 结束状态1111…11 表示完成了所有作业。 再找状态转移方程 对于状态i, 这个状态可能由前一个状态pre,加上做完一道作原创 2017-07-23 15:40:15 · 278 阅读 · 0 评论 -
hdu 1069 monkey and banana
此题是动态dp,也可以是最长单调子序列的变形。一个类型的箱子,可以变为3个不同的箱子,共有n*3个箱子,对箱子先按长排序,再按宽排序 思路:对于3*n个箱子 ,i表示第i个, dp[i] 表示,以i作为最底层箱子时的最大高度则 dp[i]=max(dp[i],dp[i]+dp[j]) dp[j] 是所有小于箱子i的高度,求出其中最大的高度。最后 ,在i个箱子对应的高度dp[i] 中选原创 2017-07-18 17:37:39 · 237 阅读 · 0 评论 -
hdu 1141 Factstone Benchmark
主题思想: 用对数来缩小数的量级。 因为数实在太大了。n!<2^x. 给出x 求出n.利用对数把乘法变成加法,且减小量级。log2(n!)<log(2^x)=xlog2(1)+log2(2)+...+log(n)<xAC 代码#include <iostream>#include<cstdio>#include<cmath>using namespace std;const in原创 2017-08-07 22:39:32 · 264 阅读 · 0 评论 -
hdu 1078 fatmouse and cheese
思想记忆化搜索还有的搜索方式是状态搜索状态搜索,是进行状态映射,以便得知某个状态是否已经搜索过了,是为了避免重复搜索, 状态搜索应用的场景是,简单地标记哪个点有没有走过,已经不再满足需求了。或者说,无法进行标记哪个点是否已经走过。记忆化搜索是,在搜索的过程中,会产生很多重复搜索,但是只要记住第一次搜索的结果值,可以直接用上次的搜索结果,并避免再次搜索,减少了搜索范围,避免了重复搜索。 记忆化搜索的原创 2017-07-23 20:45:44 · 420 阅读 · 0 评论 -
hdu 1072 Nightmare
此題有有意义,纪念下因为此題,特殊在走过的路可以重走,需要进行记忆化搜索,最小时间,肯定使用BFS走过的节点可以重走,但是如果走到这个节点的时间是相同的,则重走这一节点没有意义。 所以和以往传统搜索題不同, 传统的搜索,用visited[x][y]来标记是否走过,以便下次不再重复走 这次,需要再多加一个维度,加上时间 visited[x][y][time] 表示time相同时不需要重走, 此原创 2017-07-20 23:50:09 · 253 阅读 · 0 评论 -
hdu 1070 milk
此題理解起来简单,但是还是有些细节需要注意, 这里纪念一下。 首先定义性价比: 两种方式:每天开销最小,即每天平均下来花的钱最少。另一种:每元钱买的天数最大。 另一个注意点就是要读题,性价比一样时选择容量大的这两种方式不容易出错。如果定义性价比为,每元买到的牛奶最多,应注意有个陷阱,就是每元能喝到的牛奶最多才正确,比如500ml,其中100ml是无效的,需要去除,否则,算出的每元买到的牛奶最多原创 2017-07-19 22:30:27 · 308 阅读 · 0 评论 -
hdu 1142 dijkstra
最短路径+ 记忆化搜索注意转变思路,每一点到家的存在最短路径,则,以家为起点,寻找到每一点的最短路径。 dijkstra 单源最短路径 ,求的是 一个源s到其余每一点的最短路径记忆化搜索如果不对节点进行记忆化搜索,将会有大量重复搜索过程。如果记录结果,那么会减少搜索量。 要记录什么结果呢? 用一个数组记录每一个节点到终点有几条路径。如果遇到已经搜索过的节点,则直接返回就可以了,不必再重复搜原创 2017-08-08 15:39:55 · 227 阅读 · 0 评论 -
hdu 1143 技巧
n 为奇数 0 n为偶数, dp[2]=3; 令dp[0]=1; dp[1]=0; dp[3]=0;递推发现:其实我并没有发现,都是人家发现的 汗…… 如果最后两列拼满 则为dp[n-2]*dp[2]=dp[n-2]*3; 如果最后两列拼不满一定是最后四列拼满的,两列拼不满有2中拼法我看不懂啊, 不说了,反正最后就是得到一个通项公式 dp[i]=4*dp[i-2]-dp[i-4原创 2017-08-08 20:21:51 · 278 阅读 · 0 评论 -
hdu 1145
概率计算题 不是很理解参考博客: http://www.acmerblog.com/hdu-1145-so-you-want-to-be-a-2n-aire-1485.htmlAC代码:#include <iostream>#include<cstdio>#include<cstring>using namespace std;const double eps=1e-8;int n;doub原创 2017-08-08 21:36:17 · 390 阅读 · 0 评论 -
hdu 1172
主题思想:暴力枚举,对每一个四位数进行判断,是否全部满足猜到的情况。AC代码:#include <iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn=105;struct Node{ int a; int b; //the number of that a has equal w原创 2017-08-16 11:29:29 · 209 阅读 · 0 评论 -
hdu 1173
数学题 ,因为只能正方向行走,所以总距离dist=sum{|x-xi|+|y-yi|,i=1..n} 所以x为xi中的中位数,y为yi中的中位数时,总距离最小代码:#include <iostream>#include<cstdio>#include<algorithm>using namespace std;const int maxn=1000005;double xp[maxn];原创 2017-08-16 11:41:28 · 283 阅读 · 0 评论 -
hdu 1080 Human Genne Function
这道题我不会。dp感觉老是自己写不出来啊,状态转移方程不好建啊,问题抽象。 我一定可以超越其他人,其他人混得比我好,只是因为他们比我早几年工作吧。沉下心来学习,不要被世俗所打扰,守护你的高傲。 用的是dp的思想。 和求最长LCS的思路大体相似。 对于一个序列s1,s2. 用数组dp[i][j] 表示 s1 的第i个字符和s2的第j个字符 比较时最大值 ,,这时分3种情况: s1[i]原创 2017-07-24 18:47:11 · 273 阅读 · 0 评论 -
hdu 1084 course
完美匹配题 完美匹配肯定是最大匹配,根据题意,应该是每个学生匹配到一门课。 所以学生作为左边集合。最大匹配=最小点覆盖。 最小路径覆盖=顶点数-最大匹配数 算法匈牙利算法:bool dfs(int i){ int n=stu[i].size(); for(int j=0;j<n;j++){ if(visited[stu[i][j]]) continue;原创 2017-07-25 10:53:02 · 266 阅读 · 0 评论 -
hdu 1115
参考 博客 http://blog.youkuaiyun.com/ysc504/article/details/8812339这是一道几何题,计算多边形重心。一个n边形,从一个顶点出发连接其他顶点会得到n-2 个三角形。因为,除去这个顶点相连接的顶点有n-3个顶点,而n-3条连线分成n-2个三角形。 //①质量集中在顶点上 // n个顶点坐标为(xi,yi),质量为mi,则重心 // X =原创 2017-08-02 17:27:08 · 342 阅读 · 0 评论 -
hdu 1175
主题思想 :BFS,已经做了好几道BFS,结果这道还是没写出来, 写BFS ,要考虑好,跳过的条件,分开下,首先判断,是否跳出格子,然后判断是否可以跳过其他条件,再判断是否到达 目的地 再判断,是否访问过,进行加入。bool bfs(){ Node p; p.x=sx; p.y=sy; p.flag=-1; p.t=0; queue<Node> pq;原创 2017-08-16 20:58:34 · 233 阅读 · 0 评论 -
hdu 1150 Machine Schedule
中心思想 转化为二分图最小顶点覆盖问题。二分图最小顶点覆盖数=二分图最大匹配数那么二分图到底是哪两部分呢? 一部分是机器A ,一部分是机器B, 如果某个任务,可由 A 的Xi 和 B 的 Yi模式完成。则在Xi 和 Yi之间连一条线,有向图,A—>B 。 所以 二分图左部分集合就是机器A的模式的集合,右部分是机器B模式集合。模式从1 开始,排除模式为0的元素。详细参考博客:二分图最原创 2017-08-09 18:03:18 · 219 阅读 · 0 评论 -
hdu 1151 Air Raid
主题思想: DAG 有向无环图,最少路径覆盖本质二分图最大匹配问题二分图最大匹配数=最小点覆盖数DAG最少路径覆盖数=DAG顶点数-二分图最大匹配数。特别的 无向图的最大匹配数需要除以2。且顶点是全体。AC代码:#include <iostream>#include<cstring>#include<cstdio>#include<vector>using namespace std原创 2017-08-09 20:25:54 · 190 阅读 · 0 评论 -
hdu 1176
动态规划状态转移方程: 有三种状态,可以保持不动 ,也可以在下一秒时间走一步:向左,向右,特殊的 如果走到两端,则减少了一种情况。 由于申请的数组大。 走到最右端,再走,默认值是0, 所以可以一并处理。但是走到最左端,如果再向左走,下标变成-1 ,会出界。状态转移方程: dp[x][t] 表示t时间在x位置if(x==0) dp[x][t]+=max(dp[x+1][t+1],dp[x][t+原创 2017-08-16 22:26:27 · 214 阅读 · 0 评论 -
hdu 1087
纪念下: 这道题是简单dp,是一道自己可以看出来并实现的dp,证明之前的学习还是有用的继续加油状态选择方程: dp[i]=max(dp[j]+a[i],dp[i]) { j is a[j]#include <iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;#define原创 2017-07-26 13:23:20 · 189 阅读 · 0 评论 -
hdu 1097 数论
这题是快速求幂取模定理:a^(b) if b=2k+1 a^(b)=a^k*a^k*a if b=2k a^(b)=a^k*a^k快速幂求模#include <iostream>using namespace std;int main(){ int a,b; while(cin>>a>>b){ int ans=1; w原创 2017-07-26 16:27:07 · 190 阅读 · 0 评论 -
hdu 1156
主题思路树状数组:对线段按x坐标进行排序,从小到大依次遍历,最初开始时把所有点都加入到r边的树状数组中。随着遍历,删去已经遍历过的x坐标的点,并把这些点加入到左边的树状数组中。 需要对树状数组进行统计,以及进行更改。这也是为什么用树状数组。参考博客:http://www.cnblogs.com/Stomach-ache/p/3871751.htmlAC 代码#include <iostream>原创 2017-08-10 18:41:58 · 257 阅读 · 0 评论 -
hdu 1178
此題有纪念意义:如果两个int数很大,结果需要放到double型里面, 那么第一步请先乘以 1.0,转化成double型否则可能中间结果溢出,导致得不到正确答案 比如 int n;// n可能很大,double sum=0;sum=n*(n+1)*(n+2)/6.0;如果我们不在第一步乘以1.0,那么n*(n+1) 可能就已经溢出,结果自然是错误的,所以正确的写法是。sum=1.0*n*原创 2017-08-17 21:56:30 · 297 阅读 · 0 评论