hdu(杭电oj)第一页题目题解

原创 2014年08月16日 13:13:07

第一页有几题没写,有机会补上(嗯,忘了就是另一回事了)。

这个是无聊的时候刷了第一页。。存到博客上当做纪念吧。。


hdu1000 简单题 难度1
计算a+b的值


hdu1001 简单题 难度1
计算1+2+...+n


hdu1002 简单题 难度1
大数a+b


hdu1003 dp 难度2
最大连续子序和


hdu1004 简单题 难度1
求出现次数最多的字符串。
方法:
简单方法是应用map


hdu1005 简单题 难度1
求f(n)=(A*f(n-1)+B*f(n-2))mod 7。
方法:
由于只是对7取余,所以可以(f(n-1)%7,f(n-2)%7)最多49种,会构成长度小于49的循环,之后直接推导即可。也可以用矩阵连乘的方法解决(最简单的矩阵连乘,如果学过,这个方法最简单)。


hdu1006 数学,枚举 难度6
给定一个度数n,问一天24小时,时针,分针和秒针分别与其余两针分离都大于n的时间占一天时间的百分比。注意时间是连续的。
方法:
这题主要的难度在于找到简便的方法。比较有效的方法就是理解每次所有的针从有重合到再次有重合至多有一段连续的段符合三针分离度大于n。然后枚举每个重合到重合的时间段。
题解链接:http://blog.csdn.net/a601025382s/article/details/37814777


hdu1007 最近点对 难度2
求n个点钟最近的点对距离的二分之一。
方法:
直接套模板。也可以学下分治方法。
题解链接:http://blog.csdn.net/a601025382s/article/details/37822795


hdu1008 简单题 难度1
有一架电梯,上一层需要6秒,下一层需要4秒,停一层需要5秒,给定一个序列,问电梯运行完成需要多久。电梯起始位置为0层,最后不需要回到0层。


hdu1009 简单题 难度1
有m个房间,里边有x物资xi,需要yi的y物资交换,现在有n个y物资,问最多能换多少?可以按比例交换,不需要整个房间交换。
方法:
按价值排序,从优交换即可。


hdu1010 dfs 难度2
走迷宫,路只能走一遍,门只能在特定时间t。
方法:
特别注意剪枝,
1)当时间到t却还没到门口,那之后就不用再走了;
2)从起点到门的最短距离为d,那么中间无论怎么乱走都是d+2*x的步数(想想就能知道),即d与t同奇同偶,一开始可以排除大部分情况;
3)路的个数比t小,也可以排除


*hdu1011 树形DP


hdu1012 简单题 难度1
无输入,只要输出0<=n<=9时的所有函数值e即可


hdu1013 简单题 难度1
给定一个数,将这个数的各个位数相加,如此反复,直到数字为个位数为止。


hdu1014 简单题 难度1
方法:
思维题,想到只有两数互质才能出现good choice情况,所以只要判断两数是否互质即可。输出用%10d


hdu1015 枚举/dfs 难度1
输入整数n和大写字母字符串,在字符串中找出5个字符,将其转换成1~26的数字,使得公式v-w^2+x^3-y^4+z^5=n。
方法:
用dfs枚举所有情况,复杂度最高为12^5,这题需要注意的是输出结果取字典数最大的,所以需要先将字符从大到小排序。


hdu1016 dfs 难度2
给定一个数n,将1~n的数构成一个环,使得任意两个相邻的数之和为素数。
方法:
先预处理出所有两两相加为素数的数对。然后从1开始用dfs枚举下一个数,直到构成环。
题解链接:http://blog.csdn.net/a601025382s/article/details/37922231


hdu1017 枚举 难度1
找出所有a,b(0<a<b<n),使得(a^2+b^2 +m)/(ab)是一个整数。
方法:
枚举所有的a,b即可。注意格式,每两个测试示例之间有一个空行。


hdu1018 数学 难度1
给定整数n(1<=n<=1e7),求n!的长度。
方法:
用ans=log10(n!),ans的整数部分+1就是n!的长度
(ans分成整数部分a和小数部分b,那么n!=10^(a+b)=(10^b)*10^a,10^b为整数位为1位的小数,相当于科学技术法,那么长度就是a+1了)。
这个方法耗时很长,984MS。。


hdu1019 数学/最小公倍数 难度1
给定n个数,求这n个数的最小公倍数
方法:
逐个求最小公倍数即可。


hdu1020 简单题 难度1
给定一个大写字母字符串,将字符串中连续的相同字母,装好成kX形式。k表示连续的个数,个数为1时省略k,X为连续的字母。


hdu1021 简单题/循环 难度1
已知F(0) = 7, F(1) = 11, F(n) = F(n-1) + F(n-2) (n>=2),给定一个整数n,求F(n)是否能被三整除。
方法:
1.将每个F(i)对3取余,会发现,f(i)会在0,1,2上构成循环。(1,2,0,2,2,1,0,1,)1,2,...发现8个一循环。
2.直接矩阵连乘求的。


hdu1022 堆栈 简单1
给定两个字符串a和b,问能否通过堆栈的方式将a变成b
方法:
直接堆栈即可。注意堆栈要清空。


hdu1023 dp/卡特兰数 难度2
一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列
方法:
1.dp。dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1];入栈+出栈共i次,入栈比出栈多j次
2.卡特兰数。结果符合卡特兰数规律,可以直接套用卡特兰数公式。
结果太大,需要大数处理。也可以直接打表。
题解代码:http://blog.csdn.net/a601025382s/article/details/37928449


hdu1024 dp 难度3
输入m和n,给出一个n长数字序列。问m个不交叉连续段之和最大为多少。
方法:
dp。
dp[i][j]表示前j个序列数字,找出i段,且a[j]包含在段内时,最大的和。
dp[i][j]=max(dp[i][j-1]+a[j],max(dp[i-1][k])+a[j])(0<k<j);
题解链接:http://blog.csdn.net/a601025382s/article/details/37931599


hdu1025 最长上升子序列(dp) 难度2
对于两条平行线上的点,求最大的一对一连线,使得所有连线都不相交。
方法:
根据第一条线的序号从小到大排序,求相对应的第二根线序列的最长上升子序列即可。
注意:输出时,一条线的时候用road,多条线的时候用roads
题解链接:http://blog.csdn.net/a601025382s/article/details/38032251


hdu1026 bfs 难度2
给定一个迷宫n*m,求从(0,0)到(n-1,m-1)。其中在经典迷宫上加了数字'n',表示在这个格子中有怪物,需要号n秒去打败才能继续前进。
方法:
由于在BFS的时候,不是最先到达就是最短时间,所以标志vis[i][j]表示的意义变为到达(i,j)的最短时间。当出现耗时大于vis[i][j]的路径时可以省略。
题解代码:http://blog.csdn.net/a601025382s/article/details/38034615


hdu1027 DFS/STL 难度2
给定一个序列1,2,...,n作为第一个序列,n长序列共有n!个排列。求字典序排列后,第m个序列。
方法:
1)由于排列数是n!,所以8个数的排列就必定大于m(1<=m<=10000)了,用DFS找出8个数的前10000种排列即可。其他的n可以通过n=8来推导出来。
2)直接使用STL中的函数next_permutation(a,a+n)得到下一个序列。
两种方法这题耗时都是15MS,不过第二种写法简便,而第一种对大量数据时比较有效


hdu1028 母函数/dp 难度2
整数划分n。
方法:
1)母函数。g(x)=(1+x+x^2+...)*(1+x^2+x^4+..)*...*(1+x^n),其中x^n的系数就是答案
2)dp。dp[i][j]表示将i划分成1~j有多少种方式。dp[i][j]=dp[i][i](j>i),dp[i][j]=dp[i][j-1]+dp[i-j][i](j<=i);
题解代码:http://blog.csdn.net/a601025382s/article/details/38057901


hdu1029 简单题 难度1
求n个数中,出现次数不小于(n+1)/2的数,n为奇数。
方法:
排序后,直接查找每个数的个数。


hdu1030 简单题 难度1
找出两个数m和n间的距离。
方法:
我们把上下两个相连的三角形构成的菱形看做一个格,右斜线看做横坐标,有斜线看做纵坐标,也是四个方向(0,-1),(0,1),(-1,0),(1,0)变化,
那么就相当于直角坐标了。
从(x1,y1)到(x2,y2),这是斜角坐标,距离dis=abs(x1-x2)+abs(y1-y2);我们还需要考虑菱形中的移动,这个都是一层移动一次。
所以答案ans=dis+abs(a-b)=abs(x1-x2)+abs(y1-y2)+abs(a-b),其中a和b表示各自层数,x1,y1,x2,y2表示两个数所在菱形在斜角坐标系的位置。




hdu1031 简单题 难度1
给定n个人对m间衣服元素的满意度,选择总满意度最大的k件(总满意度相同时选择序号较小的),从大到小输出衣服元素序号。
方法:
二次排序。


hdu1032 简单题 难度1
给定一个范围[i,j],问这个范围内最大的循环数。循环数:n是奇数就n=n*3+1,n是偶数就n=n/2,直到n=1,总的操作步数就是循环数。
方法:
直接暴力求出范围内所有的数的循环数,输出最大的。


hdu1033 简单题 难度1
输入由'A'和'V'组成的字符串。A表示顺时针转90度,V表示逆时针转90度。开始位置(310,420),方向向右


hdu1034 简单题 难度1
有n个小孩,起始每个小孩都有偶数颗糖果。每次操作,小孩都将自己一半的糖果给右边的孩子,然后奇数糖果的小孩从老师那拿到一颗糖果。
问经过多少次操作,每个孩子手中的糖果一样多。
方法:
模拟操作即可。


hdu1035 简单题 难度1
给定一个n*m的矩阵,矩阵由ESWN字母组成,表示方向。再输入k,表示机器人从矩阵北方第k格进入。每前进一格,机器人根据格子中的字母改变方向。
问需要多少时间才能走出矩阵,或者走几步后会陷入几步的循环。
方法:
模拟走法,用vis[i][j]记录走到(i,j)时花的时间,以及标记走过,用来判断是否成环,以及环长。用num记录已经走过的步数。


hdu1036 简单题 难度1
给定圈数n,总距离d。之后输入队伍编号num,每圈的耗时。求平均每km需要多少时间。
注意:格式,%3d表示占3格,%02d表示占两格,不满则前补0。最后的时间四舍五入。


hdu1037 简单题 难度1
输入三个地下通道的高度,问是否有不大于168的,若有输出最前面的一个。


hdu1038 简单题 难度1
给定直径d英寸,圈数r圈,时间t秒,问自行车行驶的距离,以及时速。
注意:单位的转换。


hdu1039 简单题 难度1
给定一个字符串,判断是否符合下列规则
1)至少存在一个元音
2)不存在连续三个元音,也不存在连续三个辅音
3)不存在连续两个相同的字母,除了oo和ee


hdu1040 简单题 难度1
给定一个序列,升序排列后输出。
方法:
直接调用STL中sort方法,时间复杂度nlogn


hdu1041 简单题 难度1
从1,开始,变化规律为0变成10,1变成01,经过n次变换后,问连续的0有多少个。例:1->01->1001->01101001
方法:
列举前面几次的变换,得到数据0,1,1,3,5,11,21,...发现规律f[i]=f[i-1]+2*f[i-2],预处理出来,当i=1000时很大,需要大数处理。
结果可以打表输出。


hdu1042 大数 难度2
求n!,数据太大,需要大数处理。
方法:
由于n=10000时,长度达到40000,所以不能一位存储,需要一次存储多位。选5位长度可以避免64位。
注意:输出时,需要补齐长度,用%05d


hdu1043 双向BFS/A*算法 难度3
给定一个长度为9的序列,表示3*3矩阵,由1~8数字和字母x组成。每次操作x都可以与相邻的数字交换,问需要通过怎么样的操作才能使序列变为{1,2,3,4,5,6,7,8,x}
方法:
1)双向BFS
需要通过8个数字的逆序数的奇偶性来特判是否能成功变换得到结果。
需要将9个字母的组成的序列转换成数字,表示序列在排列中的第几个,总共360000左右各数,便于哈希。
双向bfs,缩短时间,但耗时仍旧很长
2)A*算法
通过估计函数缩短时间的求最短路算法,BFS是A*算法中的特例。
题解代码:http://blog.csdn.net/a601025382s/article/details/38091457


hdu1044 bfs+状态压缩/bfs+dfs 难度2
有一个迷宫,需要在规定时间离开,在离开前尽可能拿到珍宝,问最大能拿到的珍宝价值和为多少。
方法:
1)bfs+状态压缩
将珍宝状态压缩,用l位二进制表示l个珍宝的获取状态,每次获得珍宝时,转换状态。这种方法耗时很高。
2)bfs=dfs
用bfs找出起点到各个珍宝以及出口的最短路径,找出各个珍宝到其他珍宝和出口的最短路径。
然后dfs找出其中价值最高,但耗时不超过时间t的路径。
题解代码:http://blog.csdn.net/a601025382s/article/details/38116577


hdu1045 枚举 难度1
给定一个n*n的矩阵,里边存在墙和路,在路上放尽可能多的炮(能攻击四个方向的所有炮,除了被墙挡住)使得没有炮能攻击到其他炮。
方法:
枚举t(1<=t<2^(n*n)),t转换成二进制,1表示该位置放炮,0表示不放炮,判断是否可以成立,找出最大放炮数。


hdu1046 简单题 难度1
给定n*m的格点,问从一个角开始,遍历所有的点一次然后回到起点的最短距离。
方法:
若n是偶数,我们可以将m的最后一列留出来和n的最下面一行,为了回来,而剩余的段走S形完全遍历;m是偶数时同理,共n*m。
若都是奇数时,上述走法就不能成立,必须走一次斜线,才能变成上面的情况。共n*m-1+sqrt(2)。


hdu1047 简单题 难度1
大整数加法。


hdu1048 简单题 难度1
将给定的字符串,通过特定编码,转换成另一字符串。


hdu1049 简单题 难度1
一个井深n英寸,一只虫子每分钟爬u英寸,然后休息一分钟,滑下d英寸,问多少分钟后虫子能爬出井。
方法:
小学数学竞赛题,不断做,不断错,哎,小学的时候不长记性啊。。


hdu1050 简单题 难度1
两个走廊,两边各200各房间,一边编号1,3,5...,现在是从一个房间搬到另一个房间,耗时10分钟,
当搬运过程与其他搬运过程公用相同部分走廊时需要分次序搬运,问最少需要耗时多久。
方法:
找走廊各房间前最大重叠次数就可以了。


hdu1051 贪心 难度1
给定一堆木棍,处理第一根木棍需要准备1分钟,处理时间不记,每根木棍都有长度l和质量w,当下次处理的木棍l'>l且w'>w,则不需要准备时间。求处理所有木棍的时间。


hdu1052 dp 难度3
田忌赛马,胜得200分,平0分,负-200分。已知战斗力,现在需要安排顺序使得得分最高。
方法:
最开始想用贪心,但后来发现在有很多相等速度马的情况下,很难贪心出来。所以需要用dp。
dp[i][j]表示打了i场比赛,用了j匹慢马(从最慢的开始用)和i-j匹快马(从最快的开始用)时的最优成绩。
原理:也算是一种变着法的贪心把。我们将国王的马从大到小排序,我们要么用最好的马战胜掉,要么用最差的马顶掉。
若不用最差的马还是输了,那最差的马还是要输给别的马,当然用最差的马好;若没有输,那用好马战胜,也用这匹马战胜的效果相同,都比国王剩下的马都强。
若不用最好的马去战斗,若不能战胜那肯定不用说是费的;若能战胜,那么肯定也能战胜国王剩余的马,保留这匹马和保留最最好的马的效果一样。
dp[i][j]=max(dp[i-1][j]+judge(n-i+j,i-1),dp[i-1][j-1]+judge(j-1,i-1));
题解代码:http://blog.csdn.net/a601025382s/article/details/38125045


hdu1053 哈夫曼树 难度1
给定一个字符串,每个字符占8位,求用哈夫曼树编码后的总占位数以及压缩比。
方法:
哈夫曼树处理时,先找出所有的字符,以及其出现的次数,作为节点,全部加入队列。每次处理是取出现次数最少的两个节点,指向一个新节点,
将这个新节点加入队列,直到队列中只剩一个。这样就能原节点和新节点构成一颗二叉树。编码时二叉树左连线编码0,右连线编码1,编码所有连线。
那么一个节点的编码就是到根节点所有连线上编码的组合。


hdu1054 最大匹配 难度2
给定一颗树,求最小顶点覆盖。
题解:
树必定可以划分成二分图,二分图最小顶点覆盖=二分图最大匹配。
题解代码:http://blog.csdn.net/a601025382s/article/details/11265531


*hdu1055 贪心 难度5




hdu1056 简单题 难度1
给定数字a,找出最小的n,使得1/2+1/3+...+1/n大于a。


hdu1057 模拟题 难度1
给定天数n,给定D[0]~D[15]给定一个20*20的矩阵,每个格子内有一个0~3的数字,表示细菌数。
每天,每个格子将加上D[k],k表示这个格子以及上下左右相邻格子的细菌之和(矩阵外格子算作0个细菌,每格细菌个数不能超过3,不能低于0)。
问n天后的细菌情况。


hdu1058 简单题 难度1
将质数因子只有2,3,5或7的数称为谦逊数。现在输入n,输出第n个谦虚数。
方法:
预处理出所有谦逊数。
注意:输出的个数,n是尾数11,12,13时是th,其他尾数是1,2,3的是st,nd,rd。


hdu1059 多重背包 难度1
有6种石头,价值1~6,已知石头的个数,问能够平分成等价值两份。
方法:
多重背包,可以用做学习多重背包的基础题目。


hdu1060 数学 难度1
给定整数n(1<=n<=1000,000,000),求n^n的最左边的数字是多少。
方法:
ans=log10(n^n)=nlog10(n),将ans分整数部分和小数部分ans-=(LL)ans(其中LL 是__int64,会爆int32),
那么10^ans就是n^n前端,且只有整数部分只有一位的浮点型,答案就是(int)ans;


hdu1061 数学 难度1
给定整数n,求n^n的末尾数字多少。
方法:
末尾数字只有n的末尾数字有关,且会构成循环,找循环输出即可。


hdu1062 简单题 难度1
输出一行字符串,将每个的字符串逆序输出。
注意:用gets读入,要用getchar()接收换行符。空格可能存在前后,单词间空格可能多个,多余空格不能删除


hdu1063 数学 难度2
给定一个浮点型数a,整数n,求a^n,要求不丢失精度。
方法:
先将小数点去掉,剩下整数,作大数乘法,再加上小数点,增加小数部分不够的零以及删除小数部分后导零。
注意:输出结果是整数时,后面不能跟小数点。输出结果小于1时,整数部分的0不输出。


hdu1064 简单题 难度1
输入12个浮点数,求它们的平均值。


hdu1065 简单题 难度1
给定一个坐标(x,y),一个半圆从原点开始,每年涨50面积,问多少年涨到(x,y)。
注意:该题pi=3.1415926,输出后面没有空格。


hdu1066 数学题 难度3
求n!最后一位非零数。




*hdu1067 哈希+bfs 难度3
将整个表哈希,然后BFS,每次走一步。


hdu1068 最大独立集(二分图匹配) 难度2
给定n个人之间的关联,问最大子集,使得子集的所有人都没有相互关联。
方法:
最大独立集模板题。最大独立集=n-最大匹配。由于本身的图可能不是二分图,所以需要镜像所有点,原有点和镜像点的关系就是二分图。
最大匹配为ans,那么最大独立集就是n-ans/2(为本身是二分图的一半);


hdu1069 dp 难度1
给定n种箱子,每种箱子个数不限,每个箱子三边分别为(xi,yi,zi),分别表示长宽高,箱子可以旋转使得长宽高交换。
两个箱子i,j,只有i.x>j.x&&i.y>j.y,j箱子才能放到i上方,问最高队可以堆叠多高。
方法:
将一个箱子转换成6种固定长宽高的箱子,然后对箱子以x从小到大排序(x相等时可以根据y来排序),然后dp。dp[i]表示已第i个箱子为底最高能堆得高度。
dp[i]=max(dp[i],dp[k]+e[i].z),(0<=k<i)。


hdu1070 简单题 难度1
超市有n种牛奶,价格pi,体积vi,每天喝200ML牛奶,当盒子中牛奶小于200ML时会被丢弃,当牛奶超过5天时会被丢弃。
问最便宜(总价/能够喝的天数)的牛奶,当存在多个价格最小牛奶时,输出体积最大的一个。
方法:
体积小于200ML的牛奶价格价格计无穷,当体积大于1000ML时计1000MS(超过5天的不能喝)。求出所有单价之后排序。


hdu1071 数学 难度1
已知抛物线顶点P1和直线相交的两个交点P2,P3,求抛物线与直线之间的面积。
方法:
y=a*x^2+b*x+c,积分∫y=1/3*a*x^3+1/2*b*x^2+c*x。积分求得抛物线[x2,x3]之间的面见,减去P2,P3与横坐标构成的梯形面积就是答案了。


hdu1072 bfs 难度2
一个迷宫里,一个人身上存在定时炸弹,定时6秒,迷宫内存在重置器地点,到达地点后可以将时间重置为6s秒,求最短的时间逃出迷宫,逃不出去输出-1.
方法:
用key表示各种状态(到达重置器位置时更改状态,因为以前的标识无效了),将到达的重置位置设置为墙(回来这个位置没有意义)。之后就是正常的bfs。
题解代码:http://blog.csdn.net/a601025382s/article/details/37959971


hdu1073 字符串 难度1
匹配字符串,输出ac,pe,wa三种状态。


hdu1074 dp+状态压缩 难度2
修斯有n(1<=n<=15)个作业要赶, 每个作业都有一个限期和完成需要的时间,当作业超过时限还没有完成的时候,每超过一天,
这门课的老师会扣除这门课期末成绩1分。问如何安排作业可以使扣除的分数最少,若存在多种情况,按作业排前的优先,即作业序号字典优先。
方法:
状态压缩n个作业为i,i在二进制下第j位是1时,表示第j个作业已经被完成,否则没有。
之后dp[i].num=min(dp[i].num,dp[k].num+e[j].t)((k|j)==i&&(k&j)==0)
题解代码:http://blog.csdn.net/a601025382s/article/details/38277027


hdu1075 字符串 难度1
给定字符串翻译字典,给定一行字符,将这行中存在于字典中的字符串翻译,其余不改变输出。
方法:
用map映射单词,遍历一行字符,找出字符串后判断map中是否存在后输出。


hdu1076 简单题 难度1
已知y和n,y表示当前是第几年,问之后n个闰年是什么时候。
方法:
预处理20000个闰年f[i],二分查找y是第k个,输出f[k+n]。


*hdu1077 计算几何 难度3
用半径为1的渔网捕获尽可能多的鱼。


hdu1078 dfs 难度2
有个n*n的矩阵,每个格子当中有一个体积为e[i][j]的奶酪,一只老鼠从(0,0)位置出发,每次只能往横坐标方向走或者只能往纵坐标方向走,
每次至多走k步,下一步位置的奶酪体积必须比上一次的奶酪体积要大。求最多能吃到多少体积的奶酪。
方法:
用dfs搜索路径,由于每次都只能吃更大的体积的奶酪,所以不会出现回到已经经过位置的情况。可以用数组dp[i][j]保存(i,j)位置最大搜索值,
即记忆化,别的方向的搜索搜到这个位置的时候可以直接调用dp[i][j]而不用再次搜索,节约时间,称为记忆化搜索。
题解代码:http://blog.csdn.net/a601025382s/article/details/38292849


hdu1079 博弈 难度2
亚当和夏娃玩一个游戏,给定一个开始时间y-m-d,轮流进行操作,谁先到达2001-11-4,谁就获胜。
每次操作可以前进一天y-m-d+1或者前进一个月y-m+1-d,前进的时间必须合法(在2001-11-4之前且日期合法)。亚当先走,亚当获胜输出YES,否则输出NO。
方法:
1)找规律也可以,在(b+c)%2==0||b==9&&c==30||b==11&&c==30,的情况都输出YES,否则输出NO。abc表示年月日,
2)用到sg函数,找出所有日期的sg函数值,然后判断给定日常的sg函数值是否是0,0则输,不是0则赢。
题解代码:http://blog.csdn.net/a601025382s/article/details/38298783


hdu1080 dp 难度2
给定两个基因,对比两个基因的相似度。即给定一个表,行列项均为ACTG-,表示基因,表内数字表示行和列对应基因的相似度,-为空。
先给定两个字符串表示基因a和b,长度分别为n和m,我们可以在字符串中间加入-,使得两个字符串长度相同;现在问通过加入-,最大的基因相似度是多少?
方法:
dp[i][j]表示用了a串用了前i个字符,b串用了前j个字符的情况下,得到的最大基因值。答案就是dp[n][m]。
由于‘-’不能和‘-’配对,所以可以得出dp公式:
dp[i][j]=max(dp[i-1][j-1]+get_num(a[i-1],b[j-1]),dp[i-1][j]+get_num(a[i-1,]'-'),dp[i][j-1]+get_num('-',b[j-1]));
代码链接:http://blog.csdn.net/a601025382s/article/details/38299917


hdu1081 dp 难度2
求一个矩阵的最大子矩阵和。
方法:
枚举子矩阵高度k和开始行i,我们可以在O(n)时间内求得f序列,f[j]=e[i][j]+...+e[i+k-1][j](这个预处理sum[i][j]=e[1][j]+..+e[i][j]即可),
之后求是f序列的最大连续子序列和了。


hdu1082 堆栈 难度1
已知n个矩阵的行和列,给定一个序列,求根据这个序列构成的矩阵乘法顺序需要的几次矩阵元素相乘。
方法:
堆栈:当遇到矩阵时,加入栈;当遇到右括号时,将两个矩阵出栈相乘后再压入栈,同时计算乘法次数。


hdu1083 最大匹配 难度1
有p门课程和n个学生,已知选择每门课程的学生,问是否能找到p个不同的学生,使得p门课都有一个不同的学生代表,学生代表必须选择了这门课程。
方法:
以课程和学生建二分图,求最大匹配,如果最大匹配等于p,那么就能找到要求的p个学生,输出YES;否则不能找到,输出NO。


hdu1084 简单题 难度1
根据做题数以及题目完成时间给定分数。
方法:
根据做题数和时间排序,用num数组记录各个等级的人数,然后给人确定分数,之后根据编号再排序回来。


hdu1085 多重背包 难度1
已知1,2,5三种硬币的个数,求最小不能组成的价格。
方法;
令m等于三个硬币的总价值,以m为体积多重背包,最小不能被背包到的点就是答案


hdu1086 计算几何 难度1
判断n条线段的交点个数,相同的交点重复计算。
注意:端点相交


hdu1087 dp 难度1
已知一个序列,现在要找一个最大递增子序列。
方法:
dp[i]表示跳到i位置时最大能得到的分数,dp[i]=max(dp[k])+a[i](0<=k<i)


hdu1088 模拟题 难度1
翻译一个html本文,文本中只出现标签<br>和<hr>
注意:输出时每行开头没有空格,每行最后没有空格,输入的每个字符之间都有空格或者换行。


hdu1089 简单题 难度1
求a+b。


hdu1090 简单题 难度1
多组输入求a+b。


hdu1091 简单题 难度1
多组输入,求a+b,以0,0输入结尾。


hdu1092 简单题 难度1
求多个数的和。输入0时结束


hdu1093 简单题 难度1
输入测试样例的个数T,输入n,输入n个数,求n个数的和。


hdu1094 简单题 难度1
输入到文本末while(scanf("%d",&n)!=EOF),求n个数的和。


hdu1095 简单题 难度1
求a+b,输出的每个测试样例后输出一个空行。


hdu1096 简单题 难度1
求多个数的和,每个测试样例之后输出一个空行。


hdu1097 简单题 难度1
求a^b的末位数字。


hdu1098 简单题 难度1
输入k,求整数a使得f(x)=5*x^13+13*x^5+k*a*x对任意x都是65的倍数。
方法:
f(x+1)=5*(x+1)^13+13*(x+1)^5+ka*(x+1)=5*(C(13,0)x^13+C(13,1)*x^12+...+C(13,0)*x^0)+13*(C(5,0)*x^5+...+C(5,5)x^0)+ka*x+ka=
f(x)+5*C(13,1)*x^12+...5*C(13,13)+13*C(5,1)*x^4+13*C(5,5)+k*a,对65取余,f(x+1)=13+5+ka=18+ka,是65的倍数。枚举a=1~65,
找到a使得a*k+18是65的倍数,若不存在输出no(a=66,(a*k+18)%65=(a%65*k%65+18)%65,等效于a=1,所以只用枚举1~65)。




hdu1099 数学 难度2
有n种彩票,现在要集齐所有彩票,求买齐彩票的期望购买张数。
方法:
买第一张自己没有的概率是n/n,买第二张自己没有的概率是(n-1)/n,期望需要买1/((n-1)/n)才能买到;买第三张的概率是(n-2)/n,
期望需要买1/((n-2)/n)张。。。所以答案ans=n/n+n/(n-1)+...+n/1;求分母最小公倍数,然后通分,化简,按格式输出。


hdu1100


hdu1106 简单题 难度1
给定一串由数字组成的串,将其中的5数字当成空格,将倍分割的数字排序输出。要求去掉前导零。
方法:
c=0,c=c*10+a[i],直到a[i]为5,将c加入数组,跳过a[i]==5,然后继续前面的步骤即可。最后排序数组输出。


hdu1108 简单题 难度1
球两个数的最小公倍数。
方法:
lcm=a/gcd(a,b)*b;gcd是最大公约数,用辗转相除法求得,int gcd(int a,int b){return b==0?a:gcd(b,a%b);}


hdu1172 简单题 难度1
电脑随机产生一个四位数,给定n个猜测,每个猜测包括猜测数,个数匹配数,位置匹配数。求是否有唯一符合的四位数,有则输出。
方法:
暴力枚举所有四位数,跟猜测比较,查看个数匹配数和位置匹配数是否相等。


hdu1173 简单题 难度1
给定一个直角坐标系,上面有n个点,表示金矿,现在要选择一个位置建设基地,使得到达所有金矿的距离和最小。距离计算:fabs(x1-x2)+fabs(y1+y2)。
方法:
分别求n个坐标的横坐标和纵坐标的中位数即可。(根据中位数的性质,这样的位置距离最短)


hdu1174 计算几何 难度1
CS中的警匪对战,已知匪的位置三维坐标,身高和头半径;警的位置,身高,头半径和子弹飞行方向向量。问是否能击毙匪。
方法:
这题比较水,不用判子弹方向是否是背离匪的脑袋的。只要计算出子弹的所在直线,匪脑袋的圆心,计算圆心到直线的距离和匪脑袋的半径比较即可。


hdu1175 模拟题 难度1
连连看,给定一个n*m矩阵,0表示空格,其他数表示特定图片,只有两个方块相同,转弯次数小于等于2次才能消掉。给定位置(x1,y1)和(x2,y2),
问两个位置上的方块能否消掉。
方法:
先用a[i][j][k]数组记录一个点各个方向上的连续0的个数。然后分情况讨论,一种没有转弯,直接判断中间是否有足够的连续0即可;
其余的算一种,这个又分两种,一种是走Z型,一种走N型,Z型则向左右两边延展找出所有可以用过的位置,然后再相同纵坐标的时候判断上下是否连通即可,
N型同理。


hdu1180 bfs 难度2
一张n*m地图上,S表示起点,T表示终点,*表示墙,.表示路,|表示竖着的梯子,能让在该位置的上下方向通行,-表示横着的梯子。每分钟梯子会变化一次,
从横到竖或者从竖到横。一个人只能上下左右移动,每次耗时1分钟;人不会在梯子上停留,经过梯子达到梯子对面只用一分钟。
可以在原地停留,问从起点到终点最少需要多少时间。
方法:
bfs,在碰到梯子时判断梯子位置情况,不同相则时间多加一,位置变为梯子对面。


hdu2007 简单题 难度1
球一段区间[n,m]内所有偶数的平方和以及所有奇数的立方和。
方法:
预处理数所有的e[i],e[i].x表示所有小大于i的偶数的平分和,e[i].y表示所有不大于i的奇数的立方和,答案就是e[m].x-e[n-1].x和e[m].y-e[n-1].y;
注意:0的情况(这题好像没有0的数据),以及n>m


hdu2008 简单题 难度1
统计n长的实数序列中,负数,零和正数的个数。


hdu2009 简单题 难度1
数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。


hdu2010 简单题 难度1
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身。求给定范围内的所有水仙花数。
方法:
先预处理出所有的水仙花数,然后根据范围输出。


hdu2011 简单题 难度1
求多项式1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...的前n项的和。


hdu2012 简单题 难度1
对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。


hdu2013 简单题 难度1
每天吃掉一半多一个的桃子,n天后剩下一个桃子,问开始有几个桃子。


hdu2014 简单题 难度1
给定n个分数。去掉一个最高分,一个最低分,然后求平均数。


hdu2015 简单题 难度1
有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,
现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。


hdu2016 简单题 难度1
输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数。


hdu2017 简单题 难度1
对于给定的一个字符串,统计其中数字字符出现的次数。


hdu2018 简单题 难度1
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?


hdu2019 简单题 难度1
有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序


hdu2020 简单题 难度1
输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。


hdu2021 简单题 难度1
已知人民币一共有100元、50元、10元、5元、2元和1元六种,用最少的人民币张数凑n元。
方法:
贪心,大的纸币先用。


hdu2022 简单题 难度1
求n*m矩阵中绝对值最大的数。


hdu2023 简单题 难度1
假设一个班有n(n<=50)个学生,每人考m(m<=5)门课,求每个学生的平均成绩和每门课的平均成绩,并输出各科成绩均大于等于平均成绩的学生数量。


hdu2024 简单题 难度1
输入一个字符串,判断其是否是C的合法标识符。即字符串以字母或者下划线开头,由数字,下划线和字母组成的合法。


hdu2025 简单题 难度1
对于输入的每个字符串,查找其中的最大字母,在该字母后面插入字符串“(max)”。


hdu2026 简单题 难度1
输入一个英文句子,将每个单词的第一个字母改成大写字母。


hdu2027 简单题 难度1
统计每个元音字母在字符串中出现的次数。


hdu2028 简单题 难度1
求n个数的最小公倍数。
方法:
lcm=a/gcd(a,b)*b;gcd()为求最大公约数,int gcd(int a,int b){return b==0?a:gcd(b,a%b);}


hdu2029 简单题 难度1
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。


hdu2030 简单题 难度1
统计给定文本文件中汉字的个数。
方法:
汉字机内码在计算机的表达方式的描述是,使用二个字节,每个字节最高位一位为1。 
计算机中, 补码第一位是符号位, 1 表示为 负数, 
所以 汉字机内码的每个字节表示的十进制数都是负数
统计输入字符串含有几个汉字,只只需求出字符串中小于0的字符有几个,将它除以2就得到答案


hdu2031 简单题 难度1
输入一个十进制数N,将它转换成R进制数输出。


hdu2032 简单题 难度1
输出n层杨辉三角。


hdu2033 简单题 难度1
求两个时间的和。


hdu2034 简单题 难度1
集合A-B,即输出A集合中与B集合重复的数。


hdu2035 简单题 难度1
求A^B的最后三位数表示的整数。


hdu2036 简单题 难度1
求n个点围成的多边形面积。


hdu2037 dp 难度1
给定n个电视节目的开始时间和结束时间,问最多可以完整的看完的节目的个数、
方法:
根据开始时间排序,dp[i]=max(dp[i],dp[j]+1)(e[j].y<=e[i].x,0<=j<i)


hdu2039 简单题 难度1
给定三条边,请你判断一下能不能组成一个三角形。
注意:输入的是实数。


hdu2040 简单题 难度1
判断a和b是否是亲合数,亲和数就是a的所有真约数(不含本身的约数)和等于b,b的所有真约数和等于a。


hdu2041 dp 难度1
一开始在第一个台阶上,之后每次可以走一个台阶或者两个台阶,问走到n有多少种方法。
方法:
dp[i]=dp[i-1]+dp[i-2](n>=i>=3)


hdu2042 简单题 难度1
每次羊减少一半少一只,n次后剩余3只,问开始有几只。


hdu2043 简单题 难度1
判断难度是否安全。


hdu2044 简单题 难度1
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
注意:会超出int,需要用__int64


hdu2045 dp 难度1
给一行的n个格子染色,共有3种颜色,相邻格子不能同色,头尾不能同色,问有多少种染色方式。
方法:
dp[i][j],当j=0时表示i长格子的染色方法,j=1时表示,相邻格子染色不同,头尾染色相同的情况。
dp[i][0]=dp[i-1][0]+dp[i-1][1]*2;dp[i][1]=dp[i-1][0];
注意:会超出int


hdu2046 dp 难度1
在2*n的方格内放1*2的长条,有多少种放法。
方法:
dp[i]=dp[i-1]+dp[i-2];dp[i]表示2*i的格子的放法数。有两种放法:1是最后一个放竖条,那么有f[i-1],最后两格放两格横条,那么有f[i-2]种。
注意:超出int,dp[0]=1;


hdu2047 dp 难度1
由EOF三个字符组成的n长字符串,不出现O和O连续的情况有多少种?
方法:
dp[i][j],j=0表示结尾不是O的合法情况数,j=1表示结尾为O的合法情况数,ans=f[n][0]+f[n][1]。
dp[i][0]=(dp[i-1][0]+dp[i-1][1])*2,dp[i][1]=dp[i-1][0]。
注意:超出int


hdu2048 数学 难度1
有n个人,每个人在一张彩票写上自己的名字,放入盒子,然后每个人抽取一张,抽到自己名字的彩票则中奖,问都不中奖的概率。
方法:
用错排公式求得不中奖的情况数,即n长序列的排列,所有的元素都不在自己原来的位置上的情况数。然后求得概率。
dp[i]=(dp[i-1]+dp[i-2])*(n-1)或者ans=n!*(1/2!-1/3!+1/4!-1/5!+...+(-1)^n/n!)


hdu2049 数学 难度1
n对新人新婚,给每位新娘打扮得几乎一模一样,并盖上大大的红盖头随机坐成一排;
然后,让各位新郎寻找自己的新娘.每人只准找一个,并且不允许多人找一个.问有m个新郎找错,有多少种可能方式。
方法:
也是错排,现用组合数找出n-m个人,之后剩余的m个就是错排了。ans=c[n][n-m]*dp[m];dp[m]=(m-1)*(dp[m-1]+dp[m-2]);


hdu2050 简单题 难度1
问n条<型的折线最多能将平面分成几个部分。
方法:
找规律,每次增加一条折线所增加的区域数等于这条折线与原来的线至多有几个交点。
dp[1]=2,dp[i]=dp[i-1]+4*(i-1)+1;


hdu2051 简单题 难度1
将10进制数转换成二进制。


hdu2052 简单题 难度1
给定n和m,用+,-,|输出长宽为n和m的矩形。


hdu2053 简单题 难度1
输入一个整数n表示n次操作,第i次操作,将第i*k(k=1,2,....)个的灯开关(从开到关,或者从关到开),问n次操作后,第n个灯的状态。
方法:
求n的因子个数即可。欧拉函数。


hdu2054 简单题 难度1
判断两个数是否相等。
注意:可能是实数;数字很大,长度要开1e5,用字符串读入;可能存在前导零和后导零。


hdu2055 简单题 难度1
输入一个字母x和数字y,f(x)表示,当x为小写字母时f(x)=-(x-'a'+1),否则f(x)=x-'A'+1;求f(x)+y;


hdu2056 简单题 难度1
求两个矩阵相交区域的面积。
注意:用printf("%.2f\n",0.0);过了,用printf("%.2f\n",0);挂了。。


hdu2057 简单题 难度1
两个16进制数相加。


hdu2058 简单题 难度1
已知n和m,对于序列1,2,3...,n。找出所有和等于m的连续子序列。
方法:
起点为i,长度为k的连续序列,和为(2*i+k-1)*k/2=m,枚举k(1<=k<=sqrt(m*2))即可。


hdu2059 dp 难度2
龟兔赛跑,兔子固定移动速度vr,乌龟使用电瓶车v1,蹬电瓶车v2;电瓶车每次只能开c,路上有n个供电站,位置pi,充电时间t。
问乌龟是否可以赢兔子。
方法:
dp[i]表示到达pi(即之后要在pi充电)的最短时间,dp[i]=min(dp[k]+路上耗时)。


hdu4908


hdu4910 数学 难道3
输入一个正整数n(n<=1e18),输出所有的i相乘并对n取余所得的值。(gcd(i,n)==1,1<=i<=n)
方法:
找规律:将n分解分所有质因子相乘,质因子2个数为a,其余质因子个数为b,ans=(a==0?a:a-1)+b;当ans<2时结果为n-1,否则结果为1.
需要的知识:Miller_Rabin算法+线性筛
题解代码:http://blog.csdn.net/a601025382s/article/details/38379971


POJ+HDU+ZOJ ACM题解

  • 2011年11月03日 19:06
  • 839KB
  • 下载

[南阳OJ-No.56]阶乘因式分解(一)|给定两个数m,n,其中m是一个素数。 将n(0<=n<=10000)的阶乘分解质因数,求其中有多少个m。

南阳OJ-No.34 时间限制3000ms,内存限制65535KB,难度2 描述 给定两个数m,n,其中m是一个素数。 将n(0 输入 第一行是一个整数s(0 随后的s行, 每行有两个整...
  • dj741
  • dj741
  • 2017年02月27日 23:17
  • 425

140道杭电OJ答案

  • 2009年08月08日 14:34
  • 91KB
  • 下载

杭电OJ题目 1000

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...
  • nxy006
  • nxy006
  • 2015年06月27日 20:49
  • 3889

课程资源 杭电OJ1000-1099答案

  • 2011年07月23日 16:55
  • 50KB
  • 下载

杭电ACM第1001题(C语言版)答案——Sum Problem

# include int main() {     int n, i, sum = 0;     while(scanf("%d", &n)!=EOF) {         for(i=1; i...
  • odaynot
  • odaynot
  • 2012年09月26日 14:36
  • 10169

杭电ACM第1000题(C语言版)答案——A + B Problem

#include int main(void) { int a,b; while(scanf("%d%d",&a,&b)!=EOF) printf("%d\n",a+b)...
  • odaynot
  • odaynot
  • 2012年09月26日 14:28
  • 11960

杭电OJ2000-2099答案

  • 2009年01月04日 21:44
  • 806KB
  • 下载

杭电acm试题解析和答案

  • 2014年06月11日 11:53
  • 530KB
  • 下载

杭电ACM题2000遇到的一点问题

今天做了几个杭电的ACM题,包括2000题,题目描述是:输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。要求输入为:输入数据有多组,每组占一行,有三个字符组成,之间无空格。输出为:...
  • jeffashan
  • jeffashan
  • 2014年12月02日 23:58
  • 1246
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu(杭电oj)第一页题目题解
举报原因:
原因补充:

(最多只允许输入30个字)