USACO2.4题目简析
chunlvxiong的博客
T1:The Tamworth Two
题意:约翰和奶牛在10*10的地图上,地图上有一些障碍物,他们行走的方式如下:如果正前方没有障碍物,那么往前走,否则顺时针旋转90度。开始约翰和奶牛都朝北。如果某次行动后,约翰和奶牛处于同一位置,那么就表明约翰抓住了奶牛。问:约翰能否抓住奶牛,如果能,输出抓住的步数。
由于状态只与约翰的位置、奶牛的位置、约翰的朝向、奶牛的朝向有关,所以开一个六维标记数组进行标记,然后纯模拟即可,如果发现约翰和奶牛处于同一位置,输出当前步数,如果发现某个状态已经出现过,输出0。由于总状态数为10*10*4*10*10*4=160000,所以可以A掉此题。
T2:Overfencing
题意:给出一个迷宫高h(1≤h≤100),宽w(1≤w≤38),注意给出的迷宫是这样的(一个3*5的迷宫):
+-+-+-+-+-+
| |
+-+ +-+ + +
| | | |
+ +-+-+ + +
| | |
+-+ +-+-+-+
保证迷宫只有两个出口,且所有位置都能到达出口,每个点到达出口的最短距离中最长的是多少?
由于出口只有两个,可以使用BFS解决本题,即对于每个出口做一次BFS,计算出其到达各点的距离,这样每个点到出口的最短距离就是到达两个出口中的较小的那个。
然后枚举所有点找出最大值即可,总时间复杂度O(4wh)。
注意实际答案是(ans+1)/2。
T3:Cow Tours
题意:有N个牧场(N≤150),给出其坐标。有一些牧场之间有连边。称一个连通块的直径为其中最远的点对的距离。保证连通块的数量≥2,现在要连接两个不同连通块的牧场,使得新连通块的直径最小,输出这个直径。
首先跑一遍floyd,得出两两点对之间的距离。
然后你要确定连通块,可以利用上一步的结果,即对于点i,所有与它距离不为oo的点都属于同一连通块。然后你就暴力求出每个连通块的直径。
然后穷举要连接的牧场i,j,并找到i所在连通块中距离i最远的点x,以及j所在连通块中距离j最远的点y,那么新牧场的直径就是max(i所在连通块的直径,j所在连通块的直径,f[i][x]+f[j][y]+f[i][j])。
总时间复杂度O(N^3)。
T4:Bessie Come Home
题意:牧场的编号从'a'..‘z’以及'A'..'Y',其中大写字母表示其中有牛,谷仓编号为‘Z’,给出一些双向道路,输出哪头奶牛能最快到达谷仓以及它需行走的距离。
可以以‘Z’为源点做一次单源最短路,然后O(N)寻找距离其最近的点。
由于点数最多52,所以floyd也可以0ms跑过。
T5:Fractions to Decimals
题意:给出一个分数,输出它的小数形式,例:
输入:1 3 输出:0.(3)
输入:2 2 输出:1.0
输入:22 5 输出:4.4
要求每行输出76个字符。
关键问题是如何确定循环节。对于除到某一位的状态,可以用当前数字以及除完后剩余的数来表示,这样总的状态数最多是10*100000=1e6种,所以使用一个标记数组进行标记,边做边标记当前状态并记录当前数字,如果发现某个状态重复说明找到循环节,或者剩余除数为0表明能够整除,此时需退出循环,然后输出即可。