USACO题解记录

本题解只记录思想。若读者觉得题解思路清晰且想看看代码,可私下联系。

整理:

目录:

未整理:

USACO 1.3 Milking Cows (离散化+O(n^2)更新+O(n)线扫描)

有一群养牛人,在时间[l,r]间去养牛。问这群养牛人中时间连续重叠的最大长度,以及一人都没有的最大长度。(注意区间[1,100]与[101,200]不连续)
解:因询问区间只有5000,那么可以将点离散出来。判断连续的方式是在已排好序tmp[]的状态下,若tmp[i] - tmp[i-1]>=1,那么他们不连续,就添加新的点tmp[i-1]+1。可是tmp[i]-tmp[i-1]==1的时候没有满足我们的要求,所以对tmp[]的元素乘2,两个不连续的点相差必为偶数,则在其中加一点tmp[i-1]+1。离散完后区间更新加扫描。虽然线段树能让我们在O(nlgn)完成这道题,但不符合KISS原则(因为暴力更新也能在限定下满足)。至此题解毕。

USACO 1.3 Milking Cows (贪心)

这题给的官方答案:对左边界进行排序,然后线性扫描,不断更新连续的右区间即可。线扫描后注意特判:最后的一个区间也要统计上。

USACO 1.3 Transformations(枚举+范围分析)

有两个矩阵,通过最少的转换将第一个矩阵转成第二个矩阵。共有7种操作。
初分析:操作1~3个操作4次后等于无操作,操作4操作两次等于无操作。操作5好像情况很多。
在分析:不考虑镜面的情况下,矩阵的四种角度都只用至多一种操作1to3便能达到。那么考虑镜面的情况下,矩阵四种角度也是至多一种操作1to3可以达到。这个对应操作5。所以答案一定只有一个数字。
重点:把两个矩阵当成两块毛玻璃,当两个毛玻璃处于镜像位置时,无论如何都无法到达。而当两块毛玻璃的面向相同,只要在op{90°,-90°,180°}操作集中选一个必能到达。不管是离散的毛玻璃,还是连续的毛玻璃都符合此设想

USACO 1.3 Name That Number(阅读题+字符串映射处理+(dfs))

好多生词不会…:cattle 牛;rancher 牧场主;customary 惯常的;serial 连续的,一连串的;cowhand 牧牛工;cellular 蜂窝状的,细胞的;saddle 马鞍;cellular phone 传统手提电话;Touch-Tone 按键式;keypad 小键盘;
解法一(标答1:将输入数字用dfs回溯法来寻找):观察到dict.txt文件里的合法名字都是已经排序好的,我们每一次确定该位数字对应的英文(用递归搜索算法确定),就能确定一个符合合法名字字符串的一个连续区间,且区间只会不断向内缩小。当搜索深度==字符串长度,且字符串完全匹配,就将其输出。

USACO 1.3 Name That Number(阅读题+字符串映射处理+反向匹配)

解法二(对dict名字进行编码,然后线性搜索):将所有字母对应的数字列出来(其实不用map,直接用int M[‘A’]=2…来表示就可以啦)然后线扫。这个更加简单,复杂度也低很多。
(额外收获:map的键值key一般只能是常见值类型以及string,但value值可以是任何值类型,比如vector等。另外string数组的排序仍可以用sort,自己写个cmp,s1<s2即可。另,用到往字符串填充离散的字符,但是又想用string,那么这样开空间:string s(20,’\0’))。

USACO 1.3 Palindromic Squares(简单回文串处理)

比较水,不记录了。

USACO 1.3 Dual Palindromes(简单字符串二进制处理)

也很水…

USACO 1.4 Mixing Milk(按价格排序)

很直接的贪心题目,入门级别。

USACO 1.4 Barn Repair(贪心)

有S个牛棚,其中C个里面有牛。提供了M块板子,板子的长度任意,即可覆盖一段连续的牛棚顶,但数量固定。用M个板子,在保证所有有牛的牛棚都被覆盖的前提下,覆盖最少的牛棚。
解法:贪心思想:有M块板子覆盖了最小的长度,那么先从M-1块板子覆盖了最小长度去推出第M块板。比如M=2,那么先考虑一块板覆盖的长度(第一块板从最左端有牛的牛棚到最右端有牛的牛棚),对于M=1来说是最短的。舍弃间隔最大的区域,就相当于变成左右两侧的两块木板。贪心到M个木板即可。记得间隔选了之后就不要选第二次了。

USACO 1.4 Prime Cryptarithm(简单dfs)

对竖式的第一第二行进行dfs,得出下面的值,布尔判断一下是否就可以了。

USACO 1.4 Wormholes(Interesting&环判断+构建配对)

有趣的题目。这道题目可以教会如何用回溯来实现配对的问题。同时复习了一遍判断环相关的知识。总之是一道很好的题目!

USACO 1.4 Ski Course Design(贪心,阶梯型数据)

最高与最低海拔的差值缩小一位,根本取决于同样最低的所有山脉一同上升一位,或者同样最高的所有山脉一同下降1位。故一开始给山脉的高度排个序,判断缩小的选择是最低位同时增加1还是最高位同时减1。同时根据 ( x + 1 ) 2 = x 2 + 2 x + 1 (x+1)^2=x^2+2x+1 (x+1)2=x2+2x+1的关系式可以递推费用的增加。

USACO 1.5 Arithmetic Progressions(简单迭代)

将集合去重后,用两个数组。一个数组存集合顺序,另一个集合存放集合元素的存在。选集合的两个数,求出a,b,然后判断此a,b是否有合法的等差数列。跑个二重循环即可。

USACO 1.5 Mother’s Milk(dfs搜索模拟)

原来dfs也能写跳出已搜索过的点这道题深度不确定,所以我开始用bfs+三维数组来判重。但是网上一份dfs的代码吊打了我…
一道属于搜索出全部答案的题目。其实dfs也可以写判重,是我太菜了。这也间接反映一件事,就是遍历树的题目优先写dfs,树的构造也会根据你的搜索思路来生成。

USACO 1.6 Number Triangles(经典递推)

从下往上推。运用到汇总的思想。

USACO 1.6 Prime Palindromes(双条件,回文数)

生成质数还是回文数…1e8的数中只有1e4的回文数,所以用dfs生成回文数后再对回文数进行判断。由于回文数的对称性,生成回文数只用考虑左半部分的数的选取。

USACO 1.6 SuperPrime Rib(dfs)

看来都是考dfs的…

USACO 2.1 Flood Fill Algorithms(引文里面的题目)

1、Company Ownership [abridged, IOI 93]
题目求得是所有满足 ( A , B ) (A,B) (A,B)的关系式。 ( A , B ) (A,B) (A,B)的定义:
A = B A = B A=B
A A A指向 B B B且边权大于50
③所有满足 ( A , C i ) , i ∈ [ 1 , k ] (A,C_i),i∈[1,k] (A,Ci)i[1,k]的所有 C i C_i Ci指向B的权值相加: ∑ i = 1 k w C i > 50 \sum\limits_{i=1}^{k}w_{C_i}>50 i=1kwCi>50
解法:所有点的点权初始为0。直接从A点开始遍历,将边权赋给A指向的点的点权。只要点权大于50就继续搜索下去。所有点权大于50的点就是合法的B。
2、Street Race [IOI 95]
给定起点S与终点T,求对于任何从S出发到T的路径都必须经过的点。
解法:刚开始还想记录一下入度出度,但是一条路径不一定会经过这个点,所以入度出度对于这条路径并无什么意义。后来想了想,貌似回溯穷举也可以,但是复杂度会略高标答。
正解是一次取消一个点,看看S是否能到达T。emm,强。
Cow Tours [1999 USACO National Championship, abridged]
有两个连通块,求将两个连通块相连后(任意连边是确定大小的)整个大的连通块的最小直径。
解法:枚举两个连通块的点,将其相连。但标答没有给求解过程,私以为用Floyd来求解…(毕竟dijk要跑两次,复杂度虽然低,但代码量大啊!)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值