题目一: Agri-Net
算法:MST
方法1:kruskal
要用到并查集的方法
1.把边从小到大排序;
2.初始化:每个点自成一棵树,形成森林;
3.按边权值从小到大枚举,找到不在一棵树中的两个点,将这两棵树合并,累计权值;
小细节:记录下需要计算的代表元的结果;
方法二:PRIM
题目二:Score inflation
算法:无限背包
题目三:Humble Numbers
题目描述:给定若干质因子,求出由这些质因子所能构成的所有整数中的第K大数是多少
算法:动态规划
1.最初的想法是用D[I]表示以第i个质数结尾当前以产生的最大质数,但是错的,会漏掉一些数;
2.后来看了MAIGO的代码,自己琢磨了两天明白了他的方法,用D[I]表示第i个质数当前用来产生新数的数在产生的数串中的位置,这样肯定不会漏;
题目四:Shaping Regions
题目大意:依次给定N个有色矩形,覆盖,求最后的图形中各种可见颜色的面积
算法:搜索
1.最开始的想法是从后往前枚举,然后与后面的图形进行切割,但是具体怎么切割不清楚;
2.看了MAIGO的代码,体会了一下,明白了;
3.与后面的切割时,先去处理X两边多出来的部分,重点是要更新X,然后在处理Y两边
题目五:Contact
题目大意:给定01串,求出长度为A-B之间各个01串的数量最多的前K组
算法:枚举+位处理
1.基本思路很清晰,一次枚举位,然后对新形成的串进行分类,但关键是怎么保存这个串以及怎么更新这个串;
数据结构:
01便想到位运算,把2进制转化为10进制,长度为L的01串前加个1便可区分不同长度的相同数值的01串;
更新:
1.先去掉开头的1; 2.增加当前位的值; 3.把开头的数值用|运算强制转成1
对应的位运算分别为
s[j] &= (1 << L)-1
s[j] = (s[j] << 1) + ss[i] -'0';
s[j] |= (1 << j);
2.接下来的问题是输出格式的控制,建议先把所有有的串排个序,在分个类,出现相同数目的01串有几个,然后输出,容易控制;
题目六:Stamps
题目大意:有若干种基础面值的邮票,每种数量无限,求最多用K张邮票不能拼出的最小数是多少
算法:BFS
1.在基础面值确定的条件下,每一张面值所需最少邮票数是这个面值的固有属性;
2.一开始想用DP,但方程找不出来,后来想到用BFS的向后拓展的功能可以实现,基于1,每个点最多被加入一次队列,空间用4B-INT型需要15M,所以改用4B-INT+2B-SHORT需11.5M,实际用了14M