【算法】2019年5月HBCPC备赛记录与总结

【算法】CCPC备赛记录

Latter Better Than Never!

不怕慢,就怕站。说再多想再多都没用,撸起袖子干就完事了。


2019年4月24号(周三)·基础

今天敲了一些基础的代码,AC源码见GitHub仓库:littlecurl

原题地址如下:

《保留两位小数》

《最大公约数和最小公倍数》

《ASCII码》

《大数处理,科学计数法,保留两位小数:7的阶乘?30!》

下午在床上躺着搜到了Stanford的ACM模板:notebook

还有North American University 20周的训练任务:ACM-ICPC Preparation


2019年4月25号(周四)·图论·匈牙利算法

今天一天主要是看了liuyubobo的视频,第七章·图论,敲的代码也放到GitHub上了:littlecurl

晚上看了下面几篇博客,写的都挺好的,打算总结总结,明天自己也写一下博客。

《2016中国大学生程序设计竞赛(ccpc 杭州)题解报告》

《2016中国大学生程序设计竞赛(ccpc 长春)题解报告》

《百度百科:匈牙利算法》

《趣写算法系列之–匈牙利算法》

《最大二分匹配算法详解(匈牙利)》


2019年4月26号(周五)·图论·DFS·BFS·Prim·Kruskal

越来越发现,数据结构对算法的影响。

比如DFS仅仅使用数组,有可能导致Limit Memory Stack Overflow,也就是常说的爆栈。

但是BFS引用队列后,就不再需要进行递归,可以很快的找到最短路径。

还有就是最小生成树中最小堆的数据结构。

liuyubobo老师的视频真是个宝,链接,提取码:uueb

今天很大一部分时间都是在做C++转为Java代码的工作,具体文件请前往我的GitHub:littlecurl

另外网上已经有人总结过一些图论的题集,大家可以有的放矢的去刷题

图论500题

图论题集

HDU 3228 题解(最小生成树)(Kruskal)(内有详细注释)

HDU 2544 最短路【Dijkstra算法堆优化,Vector建图】


2019年4月27号(周六)·图论·Dijistra·Bellman

二叉树的创建以及5种遍历方式:链接

之前理解的DFS和BFS都是在无权图中的操作,今天了解了Dijistra和Bellman,两者在带权图中的操作
HDU 2544 最短路【Dijkstra算法堆优化,Vector建图】


2019年4月28号(周日)

发现两个讲算法的微信公众号:

程序员小吴

算法与数据结构微信文章目录

一个前辈对ACM的总结:

浅谈ACM算法学习与有效训练


2019年4月29号(周一)·分享

昨天晚上,学院的四个队聚在一起,互相讲了一下自己队负责的方向。说实话,算法这种东西,如果不是对它了解的彻头彻尾,否则很难讲给别人。我们四个队就是,互相听不懂互相讲的是什么,全程懵的状态。但是,我觉得花时间准备材料,想法让别人知道自己说的是一个什么东西,这个过程还是有价值的。虽然结果不是很理想,但是这个看个人了,有些人受到打击就趴在地上起不来了,或者说不愿意起来了。有些人越挫越勇。马云当年说过,失败不可怕,一无所有的时候就不要害怕失败。

今天并没有刷算法题,而是去给学校软件协会分享了一下我这三年来走过的路:

主题“分享·开源·效率”


2019年4月30号(周二)·科学技术法

这里用到了printf,类似于C语言。

具体的doubleValue()作用可以看这个方法的源码。

// 科学计数法并保留两位小数

BigInteger scienceNum = new BigInteger("12345678901234567890");
System.out.printf("%.2e",scienceNum.doubleValue());

/**
打印结果:
1.23e+19
*/

查看更多:《将一个大数转为科学计数法并保留两位小数打印


2019年5月1号(周三)

[一些最基本的问题](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
*/

对于快速幂的理解《快速幂讲解


2019年5月2号(周四)· BFS、动态规划

XVII丶B 《【BFS】【迭代】【Java】迷宫问题

夜深人静写算法《动态规划C++

Cruel_King 《动态规划入门秘籍

小碧小琳《进一步理解动态规划

Yi_xiaoqiang《一道关于扔球/扔鸡蛋/摔手机的DP问题(蓝桥杯题目/面试题)
图书馆书籍《算法设计与分析基础》·豆瓣评论链接


2019年5月3号(周五)· 字符串

更新两篇博客:

《【Tip】那些“想当然”的记录》

《【算法】绝对值排序》

还没解决的:

  1. Java处理GK2312、Unicode、ASCII直接转换

  2. 字符图形打印

2019年5月4号(周六)· 字符串

解决Java处理GBK:

【算法】实现打印汉字拼音首字母

两个计算星期几的神奇算法:

【算法】神奇的O(1)

2019年5月5号(周日)· 字符串

九章算法动态规划专题班入门篇:

动态规划入门

2019年5月6号(周一)· 动态规划

发现一个有用的网站:《易学工具箱》

去年题解报告:

【博客园】_yjun《B-icebound的商店-2018年第二届河北省大学生程序设计竞赛(DP)

【CSDN】yyyan_《2018程序设计竞赛icebound的商店

对于上面博客中画出的表格的理解:

F[0] = 1

F[1] = 1

​ → 幸运数字(待凑的总价)

12345
111111
21 + f[2-1] = 21 + F[3-2] = 21 + F[4-2] = 31 + F[5-2] = 3
32 + F[3-3] = 33 + F[4-3] = 43 + F[5-3] = 5
55 + F[5-5] = 6

F[i] = F[i] + F[ i - F[j] ]

2019年5月7号(周二)· Java基础

发现一个优秀的刷题网站,整合了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()优化,也就是如何快速一个字符、一个空格、一个字符的读取,那就要看第二篇文章了。

2019年5月8号(周三)· BFS · 动态规划

BFS入门题(一维数组):【CSDN】cfreezhan《POJ 3278 Catch That Cow 【bfs+队列】》

BFS进阶题(二维数组):【CSDN】梅森上校《JAVA算法:走迷宫》

2019年5月9号(周四)· 模板

自己总结了一些java基础知识

CCPC模板-Java基础

2019年5月14号(周二)·总结

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个专题,前辈总结的很好。

④要学会合理休息

虽说要往死里学算法,但不能真的把自己学死了,或者把自己学的呕吐,再也不想学算法那种情况。

生活不止代码。需要头脑的地方不止算法。

还有运动,音乐,摄影,美食,脱口秀,美景,亲情,友情,爱情等等。

结尾来个排比句做总结吧:

牛逼的国家会有百年大计,十年规划,五年目标;

牛逼的公司会有二十年大计,五年规划,三年目标;

牛逼的人会有长期规划,中期规划,短期目标。

希望你胸怀理想,脚踏实地。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值