ACM训练总结

ACM训练总结

转眼间,一个学期的时间便匆匆地从指间溜走了,ACM的学习也在这不知不觉中结束了,也是时候对这十八周的ACM学习做一个总统的总结了。
最初了解到ACM竞赛是在学校组织的一次专业社团的介绍活动中,在那几个小时里,一个接一个的学长陆陆续续地上台为我们这些刚刚迈进大学校园的“孩子们”介绍他们所属的专业社团,热情地向我们展示着各个社团的风土人情以及我们可以通过社团活动获得哪些成长,就在这茫茫团海中,我唯独被ACM社团激起了我久违的兴趣,大部分原因是因为学长和学姐它的超高回报,再者就是它所具备的具有高难度的挑战性——我已经很久没有挑战过踏踏实实做好一件需要极多的努力才能做到的事情了,上一次还是初中时期,初二时努力了一波,从学校中上游一跃成为了学校前列,虽然初三时稍有懈怠,但还是比较轻松地考进了全市最好的高中,之后适应高中的高学习强度的生活方式适应了差不多一年,此间落下了很多进度,高二稍微努力了一下,但是努力的有点少了,并没有达到预期效果,转眼到了高三,那时的我已经对学习感到厌烦了,于是开始疯狂划水、请假,最后的高考勉勉强强过了一本线,然后又勉勉强强又被一本院校录取,然后是最“快乐的”两个多月的暑假,那段时间我没有学习一点专业相关的知识,之前高三的请假也要完成的“兴趣”也被搁置在了一边,简直颓废的不能再颓废了,再然后,我便带着这样的状态糊里糊涂地迈进了大学校园,这是我第一次远离父母,再加上我并不是很擅长交际,宿舍舍友不是同班同学更是雪上加霜,那一段时间我无比孤独,直到那次专业社团介绍活动会上我了解到了ACM,当时我想,与其浑浑噩噩地混完大学生活,不如向困难宣战,万一能混出一些成果呢。于是,在社团招生那天,我怀着一丝丝紧张到达了报名地点,没想到的是,专业一大半的学生都来了,我们班的同学甚至都到场了,在那里,我遇到了几个“志同道合”的同学,在那之后,每一次社团活动我们都会一起去参加,彼此的感情也逐渐加深,这种不孤独的感觉是我第一次在大学中感受到,那段时间里,我没有落下一次社团活动,每次都满怀热情地积极参加,自以为是地觉得我正在用努力换取着其他人无法得到的知识,我甚至在新生赛的前一天晚上复习ACM社团的知识到了半夜,我高考前都没这么认真过,那是我子进入大学后最有动力的一段时间,然而,新生赛考到的题目是完全不需要社团讲到的知识的基础题,这打了我一个措手不及,虽然最后得到了奖项,但是看到那些没有参加过社团活动的同学得到了比我好的成绩,我的心中充满了委屈和不甘,也许是我太脆弱了点,也许是我早已在高中便丧失了向现实反击的勇气,反正这次的失败消磨了我的斗志,我不再像以前一样对这门课程那么热情了。之后寒假到来,开始时,我跟着社团的步子做着相关的练习,但是随着题目越开越难,我逐渐失去了斗志,就和高三时一模一样,我很清楚这会重蹈一次失败的覆辙,但是我不是很想改变,毕竟自暴自弃比振作起来努力轻松得多,后来疫情来袭,因为种种原因,我又不能紧跟老师的步伐持续地学习ACM的相关知识,练习也是不能及时地做完,甚至连及时退课也没能做到,呵,真是失败的一个人。
虽然没有圆满地完成这门课程,但是也在这十八周的时间中学习到了不少不曾知道的很有帮助的知识。以下是对这些知识的总结。
递归
定义概述:一种通过重复将问题分解为同类的子问题而解决问题的方法。
适用问题:解决结构自相似的问题。即:构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决。
注意:
递归边界条件(递归终止条件):确定递归到何时终止,或者说,直接有解的情况。
递归模式(递归体):大问题是如何分解为小问题的

贪心算法
贪心算法是从问题的初始状态出发,通过若干次的贪心选择而得到的最优 值的一种求解策略,即贪心策略。简单来说,就是根据要求,不断选择最大/最小的,直到满足/不满足条件为止
一般步骤: 1.建立数学模型来描述问题;
2.把求解的问题分成若干个子问题;
3. 对每一子问题求解,得到子问题的局部最优解;
4.把子问题的局部最优解合成原来问题的一个解

动态规划
所谓动态规划,就是解决多阶段决策问题的一种方法。其实质上就是一种排除重复计算的算法,更具体的说,动态规划就是用空间换取时间
一般步骤:
1.判断问题是否具有最优子结构性质,若不具备则不能用动态规划
2.把问题分成若干个子问题(分阶段)
3.建立状态转移方程(递推公式)
4.找出边界条件
5.将已知边界值带入方程
6.递推求解

(简单)背包问题
题目特征:
有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放
基本思路:
若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题:
1、如果不放第i件物品,那么子问题就转化为“前i-1件物品放入容量为v的背包中”,价值为:f[i-1][v];
2、如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-w[i]的背包中”,此时能获得的最大价值就是f[i-1][v-w[i]]再加上通过放入第i件物品获得的价值w[i],即:f[i-1][v-w[i]]+c[i]。
用f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。
则其状态转移方程便是:
f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}

完全背包问题
题目特征:
有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的体积是w[i],价值是c[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
基本思路:(转化为01背包问题
从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件、取1件、取2件……等很多种。
第i种物品最多选V/w[i]件,于是可以把第i种物品转化为V/w[i]件费用及价值均不变的物品,然后求解这个01背包问题。
若将一种物品拆分为多个物品,则我们可以得到更高效的转化方法:将第i种物品拆成费用为w[i]*2k、价值为c[i]*2k的若干件物品,其中k满足w[i]*2^k<=V

多重背包问题
其题目特征为:
有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大 。
基本思路:
对于第 i 种物品有 num[i]+1种策略:取 0 件,取 1 件……取 num[i] 件,令 f[i][v] 表示前 i 种物品恰放入一个容量为 V 的背包的最大权值。(和完全背包问题很类似,基本的方程只需将完全背包问题的方程略微一改即可。)
其与完全背包的区别在于,完全背包中的物品是不限量的,而多重背包的第 i 种物品最多取 num[i] 个
则有状态转移方程:f[i][v]=max{ f[i-1][v-kw[i]]+kc[i] }

分组背包
其题目特征为:
有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
基本思路:
这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。
设f[k][v]表示前k组物品花费费用v能取得的最大权值,则有:
f[k][v]=max{f[k-1][v],f[k-1][v-w[i]]+c[i] |(物品i属于第k组)

二分查找算法
定义:在一个单调有序的集合中查找元素,每次将集合分为左右两部分,判断解在哪个部分中并调整集合上下界,重复直到找到目标元素。
查找函数:

double low=“区间下界”,high=“区间上界”,mid;
while(high - low > 1.0e-6)
{
  mid = (high + low)/2;
    if(Caculate(mid)<x)  //x:待查找的值,Caculate():所要查找的函数,在这里单调递增
        low=mid;
    else
        high=mid;
}
     //需保证查找的值在区间范围内

————
``

三分查找算法
题目特征:当需要求某凸性或凹形函数的极值,通过函数本身表达式并不容易求解时,就可以用三分法不断逼近求解。
解题方法:
类似二分的定义Left和Right
mid = (Left + Right) / 2
midmid = (mid + Right) / 2;
如果mid靠近极值点,则Right = midmid;
否则(即midmid靠近极值点),则Left = mid;*

数论
数论1(周训练总结十)
数论2(周训练总结十一)
数论3(周训练总结十二)
——————————————————————————
以上便是这学期ACM相关学习的总结了,说实话,这次的学习并没有得到预期效果,但是,如果大二还有机会选择这门课程的话,我还会再选择这门课程的,届时,我不会再留遗憾!
最后,感谢老师的辛勤付出,也感谢老师给我一次可以总结自我的机会,我已经很久没有洋洋洒洒地写这么多的自我的心路总结,我感觉心结已经解开了一些了,十分感谢!

你可能感兴趣的:(ACM周训练总结,ACM,笔记)