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表明能够整除,此时需退出循环,然后输出即可。

posted @ 2017-08-18 13:25  chunlvxiong  阅读(245)  评论(1编辑  收藏  举报