首先对二级算法做一个总结吧,大体上都是一些不是很难的题,但是很有助于提高的,毕竟对于我这样的萌新来说。既然题已经刷完了,当然还是写一篇总结,对学到的经验进行一下总结。。。不然下次碰到不会的还是不会就很尴尬了。
下面进入正文:
1873 初中的算术:
就是大数运算,如果想写的同学可以用C++去写写,也不是很难就是麻烦点,就当是练手了,这方面的博客很多直接百度就好了。这里笔者比较懒就直接用Java暴力过了。。。Java大法好啊。
import java.math.BigDecimal;
import java.util.*;
public class MAIN {
public static void main(String args[])
{
Scanner cin = new Scanner(System.in);
double m = cin.nextDouble();
int n = cin.nextInt();
BigDecimal ans=new BigDecimal("1");
for(int i = 0; i < n; i++)
ans = ans.multiply(BigDecimal.valueOf(m));
String s=ans.stripTrailingZeros().toPlainString();
int i=0;
if(s.charAt(0)=='0'&&s.charAt(1)=='.')
i=1;
for(;i
1596 搬货物问题:
二进制的重要性,存0-1e6的这些指数的出现次数,然后不停的除2进位就可以,从低位开始,只要是留下的某一位进不上去剩下一个了,那就是一定要花费一次机会去运送这个。需要注意的是:1,题中输入的货物的2^wi的wi不是货物的重量;2,数组最大要开大点,后面可能会进好几次超过1e6.
#include
#include
#include
#include
#include
#include
#include
#include
#include
1521 一维战舰:
核心就是每次失去一个可用位置k,对于整个区间的影响。也就是只需要计算出来k位于的区间[l, r]本来的可容纳战舰数再减去k被占据之后,可容纳的战舰数。有点像莫对算法里的区间转移的问题。解决了这个就按题意模拟就行了
#include
#include
#include
#include
#include
#include
#include
#include
#include
1489 蜥蜴和地下室:
dfs,这个没啥好说的,就是多练练吧,数据量很小,dfs就好了
#include
#include
#include
#include
#include
#include
#include
#include
#include
1629 B君的圆锥:
数学问题,自己动笔算吧
1433 0和5:
找规律问题,被9整除和5的个数是有关系的,算几组就可以了
1413 权势二进制:
找规律问题,这个很好想。就是所有位中的最大数字。
1432 独木舟:
很容易想的贪心,尽量将最重的和最轻的一起匹配,这样的浪费是最小的,自然是最优的。在对数据的顺序不做要求的时候,排序经常是一种有效的手段,能让问题简单不少。
1428 活动安排问题:
贪心+1 , 每次贪心的选择最先开始的活动,如果此时教室已经不够用,那么就需要再开一个。实际生活中也是这样的。
#include
#include
#include
#include
#include
#include
#include
#include
#include
1417 天堂里的游戏:
好像也是一个找规律的题。
#include
#include
#include
#include
#include
#include
#include
#include
#include
1315 合法整数集:
http://blog.csdn.net/xh413235699/article/details/72783711
1279 扔盘子
http://blog.csdn.net/xh413235699/article/details/72802196
1278 相离的圆
只需要将所有的圆的左位置进行记录,并进行排序,然后对于每一个圆我们都统计在他右边相离的圆的个数,只需要二分找到那个临界点就好了。而且这样统计下来并不会重复统计。因为我们是单方向统计的,很多时候单方向的计数都可以避免重复计数的问题。
#include
#include
#include
#include
#include
#include
#include
#include
#include
1266 蚂蚁:
最短时间很显然,主要是最长时间,这里就考验大家的分析能力了,仔细想想其实,那个碰头之后互相反向,其实可以等价为两个蚂蚁都是继续走自己的路,也就是说这个反向根本没用。是用来干扰我们理清问题的思路的。(可以这么想,两个蚂蚁碰头之后,他们处于同一个位置,也就是可以认为它们是同一个蚂蚁,那么这两个蚂蚁是没有区别的,只需要让每一个蚂蚁保持原来的行走方向就可以了,那么最大值就是max(x, l-x)).其实每次折返的过程可以看作两个蚂蚁互换了角色的过程,举个例子自己画画图比较好理解。
1138连续整数问题:
http://blog.csdn.net/xh413235699/article/details/72808736
1133 不重叠的线段:
贪心,优先选择左端点小的线段。
#include
#include
#include
#include
#include
#include
#include
#include
#include
1126 求递推序列的第n项:
转化递推公式为矩阵相乘的形式,这样可以利用矩阵的性质,先对矩阵的乘积进行计算,然后这里就可以使用矩阵快速幂算法O(logn)。算是一类型题吧,记下。
#include
#include
#include
#include
#include
#include
#include
#include
#include
1119 机器人走方格:
http://blog.csdn.net/xh413235699/article/details/72859044
1095 Anigram单词:
互为Anigram的单词,出现的字母都是相同的,而且数量也相同。利用这点,对原始单词进行统计一遍,然后每一个单词按照字典序在排序一遍,最后查map,两个数量相减就是答案。
#include
#include
#include
#include
#include
#include
#include
#include
#include
1094 和为k的连续区间
没有什么复杂度的问题,就是一个map的灵活运用。(STL真的重要)
#include
#include
#include
#include
#include
#include
#include
#include
#include
1092 回文字符串:
总长度减去最大公共子序列就是答案。所以就是一个最大公共子序列问题。动态规划。
#include
#include
#include
#include
#include
#include
#include
#include
#include
1062 序列中最大的数:
预处理。
1067 Bash游戏:
找规律题,如果模7等于0或者2就是B赢,否则A赢。
1050 循环数组最大字段和:
http://blog.csdn.net/xh413235699/article/details/77837180
1042 数字0-9的数量:
http://blog.csdn.net/xh413235699/article/details/77886860
1031 骨牌覆盖:
找规律问题。好像是首项为1,2的斐波那契数列。
1007 正整数分组:
背包问题的变形。选择的部分和越接近sum/2则二者的差值就越小,也就是答案。只需要求解最接近sum/2的结果。
#include
#include
#include
#include
#include
#include
#include
#include
#include
1024 矩阵中不重复的元素:
取对数大法好,数据量完全可以枚举但是数据会溢出,这时候取对数就很有用了。
#include
#include
#include
#include
#include
#include
#include
#include
#include
1014 X^2 Mod P:
水题,直接枚举就好。
1010 只包含因子2 3 5 的数:
http://blog.csdn.net/xh413235699/article/details/77898885
以上就是全部的51nod的二级算法题的题解了。总的来说虽然题不是很难,但是涉及的算法还是挺多的,常常回头看看,温故而知新。
其中大概涉及到:大数运算(这个有java的库可以用),二进制,dfs,数学问题(数学运算简化问题,除法取模,找规律),预处理,二分,贪心,矩阵快速幂,STL(stack,map,set),动态规划,取对数。
其中动态规划真的是很高深的东西,这下面还是可以分成好多类题。
算法者,贵在积累,深入浅出。