不怕慢,就怕站。说再多想再多都没用,撸起袖子干就完事了。
今天敲了一些基础的代码,AC源码见GitHub仓库:littlecurl
原题地址如下:
《保留两位小数》
《最大公约数和最小公倍数》
《ASCII码》
《大数处理,科学计数法,保留两位小数:7的阶乘?30!》
下午在床上躺着搜到了Stanford的ACM模板:notebook
还有North American University 20周的训练任务:ACM-ICPC Preparation
今天一天主要是看了liuyubobo的视频,第七章·图论,敲的代码也放到GitHub上了:littlecurl
晚上看了下面几篇博客,写的都挺好的,打算总结总结,明天自己也写一下博客。
《2016中国大学生程序设计竞赛(ccpc 杭州)题解报告》
《2016中国大学生程序设计竞赛(ccpc 长春)题解报告》
《百度百科:匈牙利算法》
《趣写算法系列之–匈牙利算法》
《最大二分匹配算法详解(匈牙利)》
越来越发现,数据结构对算法的影响。
比如DFS仅仅使用数组,有可能导致Limit Memory Stack Overflow,也就是常说的爆栈。
但是BFS引用队列后,就不再需要进行递归,可以很快的找到最短路径。
还有就是最小生成树中最小堆的数据结构。
liuyubobo老师的视频真是个宝,链接,提取码:uueb
今天很大一部分时间都是在做C++转为Java代码的工作,具体文件请前往我的GitHub:littlecurl
另外网上已经有人总结过一些图论的题集,大家可以有的放矢的去刷题
图论500题
图论题集
HDU 3228 题解(最小生成树)(Kruskal)(内有详细注释)
HDU 2544 最短路【Dijkstra算法堆优化,Vector建图】
二叉树的创建以及5种遍历方式:链接
之前理解的DFS和BFS都是在无权图中的操作,今天了解了Dijistra和Bellman,两者在带权图中的操作
HDU 2544 最短路【Dijkstra算法堆优化,Vector建图】
发现两个讲算法的微信公众号:
程序员小吴
算法与数据结构微信文章目录
一个前辈对ACM的总结:
浅谈ACM算法学习与有效训练
昨天晚上,学院的四个队聚在一起,互相讲了一下自己队负责的方向。说实话,算法这种东西,如果不是对它了解的彻头彻尾,否则很难讲给别人。我们四个队就是,互相听不懂互相讲的是什么,全程懵的状态。但是,我觉得花时间准备材料,想法让别人知道自己说的是一个什么东西,这个过程还是有价值的。虽然结果不是很理想,但是这个看个人了,有些人受到打击就趴在地上起不来了,或者说不愿意起来了。有些人越挫越勇。马云当年说过,失败不可怕,一无所有的时候就不要害怕失败。
今天并没有刷算法题,而是去给学校软件协会分享了一下我这三年来走过的路:
主题“分享·开源·效率”
这里用到了printf,类似于C语言。
具体的doubleValue()作用可以看这个方法的源码。
// 科学计数法并保留两位小数
BigInteger scienceNum = new BigInteger("12345678901234567890");
System.out.printf("%.2e",scienceNum.doubleValue());
/**
打印结果:
1.23e+19
*/
查看更多:《将一个大数转为科学计数法并保留两位小数打印》
[一些最基本的问题](C:\Users\acer\Documents\Markdown文档)
快速幂,要求时间为1s内,常规解法超时。
东秦这个系统,不告诉你到底错在哪。
只有在这上面刷题刷多了才知道,哦,我本地测试用例全通过,到你这一个也不通过,这种情况就是超时。
其实,有些时候,东秦网站底下测试用例全部报错,并非全部不通过,可以点击左侧栏的饼状图看一下具体的通过率,这道题常规解法通过率为9%,由此可以推断,的确是超时。
// 快速幂解法
public static BigInteger ksm(int a, int b) {
// a 为底数, b 为指数
BigInteger r = BigInteger.valueOf(1);
BigInteger base = BigInteger.valueOf(a);
BigInteger m = BigInteger.valueOf(20180520);
// 当 b >>= 1 不为 0 时,循环
while (b != 0) {
if (b % 2 == 1) { // 指数为奇数
r = r.multiply(base);
r = r.mod(m); // 对结果进行优化
}
base = base.multiply(base);
base = base.mod(m); // 对结果进行优化
b >>= 1; // 相当于b=b>>1
}
return r;
}
// 常规解法
public static BigInteger common(int n) {
BigInteger res = new BigInteger("1");
BigInteger mul = new BigInteger("2");
BigInteger yu = new BigInteger("20180520");
for (int i = 0; i < n; i++) {
res = res.multiply(mul).mod(yu);
}
return res;
}
/*
求2的20162245次方并对20180520取余
快速幂用时 : 741 μs ≈ 1 ms
常规解法用时: 1723 ms ≈ 2 s
*/
对于快速幂的理解《快速幂讲解》
XVII丶B 《【BFS】【迭代】【Java】迷宫问题》
夜深人静写算法《动态规划C++》
Cruel_King 《动态规划入门秘籍 》
小碧小琳《进一步理解动态规划》
Yi_xiaoqiang《一道关于扔球/扔鸡蛋/摔手机的DP问题(蓝桥杯题目/面试题)》
图书馆书籍《算法设计与分析基础》·豆瓣评论链接
更新两篇博客:
《【Tip】那些“想当然”的记录》
《【算法】绝对值排序》
还没解决的:
Java处理GK2312、Unicode、ASCII直接转换
字符图形打印
解决Java处理GBK:
《【算法】实现打印汉字拼音首字母》
两个计算星期几的神奇算法:
《 【算法】神奇的O(1)》
九章算法动态规划专题班入门篇:
《动态规划入门》
发现一个有用的网站:《易学工具箱》
去年题解报告:
【博客园】_yjun《B-icebound的商店-2018年第二届河北省大学生程序设计竞赛(DP)》
【CSDN】yyyan_《2018程序设计竞赛icebound的商店》
对于上面博客中画出的表格的理解:
F[0] = 1
F[1] = 1
→ 幸运数字(待凑的总价)
↓
价
格
耗
值
1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|
1 | 1 | 1 | 1 | 1 | 1 |
2 | 1 + f[2-1] = 2 | 1 + F[3-2] = 2 | 1 + F[4-2] = 3 | 1 + F[5-2] = 3 | |
3 | 2 + F[3-3] = 3 | 3 + F[4-3] = 4 | 3 + F[5-3] = 5 | ||
5 | 5 + F[5-5] = 6 |
F[i] = F[i] + F[ i - F[j] ]
发现一个优秀的刷题网站,整合了poj,hdu,codeforce等国内外著名刷题网站:Virtual Judge
一些Java基础相关的博客:
【博客园】张小凡《浅析java中的语法糖》
从这篇浅析中我们可以了解到,Java在循环中连接字符串时会new StringBuilder,最好的做法就是在循环外定义一个StringBuilder sb = new StringBuilder();对象,然后循环内调用 sb.append(str); 这样可以节约一点内存。
【博客园】程序咖啡《Java快速输入输出》
【CSDN】GGBoyer《ACM—JAVA最快的输入方式》
上面的文章介绍了如何快速一行一行的读取和打印,相当于Scanner类的nextLine()的优化,但是没提到对Scanner类的next()优化,也就是如何快速一个字符、一个空格、一个字符的读取,那就要看第二篇文章了。
BFS入门题(一维数组):【CSDN】cfreezhan《POJ 3278 Catch That Cow 【bfs+队列】》
BFS进阶题(二维数组):【CSDN】梅森上校《JAVA算法:走迷宫》
自己总结了一些java基础知识
CCPC模板-Java基础
2019年5月12号,河北省CCPC竞赛,地点秦皇岛。
首先,赛前真的会发一件T恤,没有强制要求穿。赛中AC一道题后,真的会有人来给你起球。中午12点左右,真的会发面包,火腿,牛奶。
然后,本地测试环境官方给的是C++11,JDK1.8.凡是C++11,JDK1.8有的,都让用。一开始,我们那台电脑不能使用Arrays.sort()以及集合像Map、Set等等。我们第一次参赛,以为是竞赛故意限制不让用,其实不是。就是他们学校“laji”,电脑环境有问题或者Eclipse版本过低不支持JDK1.8。比赛开始后,来来回回调试了20多分钟才调好。但那也算在比赛时间里了…
**最后,**对本次赛题的一些总结:
①不要轻易提交代码
因为多次提交通过后是要加罚时的。就拿这次比赛来说,从第42名开始到150多名都是只AC了3道题,这种情况加就比谁提交的次数少了。
提交之前,一定要检查是否int越界,不光有加法,乘法这样导致int上限越界的情况,还有减法会导致int下限越界。
②不要盲目跟从榜单
大多数人会的,你有可能会;大多数人不会的,你也有可能会,或者说你带的资料上有大多数人不会的类似题型。不要看到榜单上很少人答,然后你连题也不看就把自己否了。要相信自己的能力,既然去竞赛,那就不是去争第二、第三的。要有一颗冠军的心。
③不要轻视一些基本功
比如,输入输出格式。如果有具体次数的输入,比如说输入T组数据,那就是for循环。如果说没有说具体多少次,而只是简单的说有多次输入,那就是while循环。
如果需要输入输出的数据量特别大,那就要考虑快速输入输出了。
还有一些就是输出格式:
比如多位小数点,保留两位小数,科学计数法。
还有左对齐,右对齐输出。等等。
④不要花了时间,仍有盲点
比如你花了2天时间看二分图,匈牙利算法,没看懂,然后就不看了是不应该的,应该千方百计的想法弄懂它。
比如你花了1天时间看快速幂依然没看懂,然后也不看了是不应该的,哪怕找数学老师也要弄懂这些。
比如你曾想将二维数组,邻接表,邻接矩阵之间相互转换。写了1天也没有写出来,然后放弃了是不应该的。等等。
一定要在比赛前将这些本可以弄清楚的东西弄清。不要怕花了3天时间去弄懂什么是二分图最大匹配的实现代码是在浪费时间。算法竞赛总共就那么多知识点,你啃掉一块就是一块。
至于如何扫清盲点,那就是去各种在线OJ网站找对应的题刷题了。只要肯找,肯定有对应的题等着你刷。
但同时要记住,不要完美主义,有些时候,现在不理解的,先就这样记下来,随着时间的推移,有可能在未来的某一天突然就理解了,大家应该都是成年人了,经过都经历过这种经历。
前面说了4个不要,下面说4个要:
①要往死里学算法
这里要加一个时间状语,大学期间,要往死里学算法。因为离了大学,除非你的工作时算法设计师,天天可以搞代码。大多数人都是拿来封装好的算法框架代码直接用的。
所以在大学期间,要往死里学算法。而且要趁早地参加一些算法竞赛,以赛促学。如果心疼一些报名费,那就逼自己去做一些兼职,或者办理国家助学金,也要凑够报名费去参加一些竞赛。不一定所有竞赛都参加,但要有那么一两次竞赛的经历,以赛促学。
②要综合多种学习资料
视频、图书、博客、公众号、刷题OJ网站等等,不能认准一样学习资料死看,容易造成片面的理解。我个人认为,应该先看视频,打开思路后再看一些书籍,博客,公众号,刷题等等。
③要坚持刷题
线上有很多OJ网站,比如POJ,HDU,CodeForce等等,都要去看一下,然后选一个适合自己的。
我个人认为,VirtualJudge比较好。网址
VJ上面有个kuangbin带你飞23个专题,前辈总结的很好。
④要学会合理休息
虽说要往死里学算法,但不能真的把自己学死了,或者把自己学的呕吐,再也不想学算法那种情况。
生活不止代码。需要头脑的地方不止算法。
还有运动,音乐,摄影,美食,脱口秀,美景,亲情,友情,爱情等等。
结尾来个排比句做总结吧:
牛逼的国家会有百年大计,十年规划,五年目标;
牛逼的公司会有二十年大计,五年规划,三年目标;
牛逼的人会有长期规划,中期规划,短期目标。
希望你胸怀理想,脚踏实地。