2017.07.16【NOIP提高组】模拟赛B组小结

来源:互联网 发布:淘宝上什么是禁售商品 编辑:程序博客网 时间:2024/06/08 17:56

T1jzoj1300. 卫星照片

Description

  农夫 John 正在研究他的农场的卫星照片.照片为一个R (1 <=R <= 75) 行 C (1 <= C <= 75) 列的字符矩阵表示.如下图:
  ………………
  ..#####…….##..
  ..#####……##…
  ………………
  #…….###…..#.
  #…..#####…….

  图上的一块相连通的 “#” 表示一群奶牛或一个房间, 两个子”#” 连通的意思是说左右或上下相连.而下面的两块则是分开的:
  ….
  .#..
  ..#.
  ….

  John现在根据卫星照片上的的这些”#”块的形状来判断哪些是牛群,哪些是房间.如果一个”#”块形状一个内部和边全部都是“#”的矩形,则是房间,如果一个连通块只有一个“#”,也是房间.其它的则认为都是牛群.在第一个图中,有三个房间 ( 2x1, 2x5, and 1x1)和2群牛.
  请根据输入文件中的数据,统计出房间数和牛群数.数据中牛群不会包围另一个牛群或房间.

Input

  * 第一行,两个整数: R 和 C.
  * 和 2..R+1行: 第 i+1 行表示照片的第 i 行情况,由 C 字符组成.

Output

  * 第一行: 房间数.
  * 第二行: 牛群数.

Sample Input

5 8
#####..#
#####.##
……#.
.###…#
.###..##

Sample Output

2
2
想法:
找出每一个联通块,判断是否为矩形
找出上边界,下边界,左边界,右边界,
判断是否满
或者找出下边界,右边界,判断个数是否符合要求

T2jzoj1302. DigitalCounter

Description

  我们有一个N位数字的电子表,当时间到达10^N-1时,下一秒就归0。下面我们给出数字0 到 9的模拟图。
 对于每个数字,相邻两个+之间会有一根电子管,当显示该数字时,这些电子管就会发亮。如上图所示:数字0到9,它们的电子管数量分别是:6、2、 5、 5、 4、 5、 6、 3、 7、 5。
  设现在的时刻是X, 那么可以算出该时有多少根电子管是亮的。比如:现在时刻是:99,那么共有5 + 5= 10根电子管是亮的。假如从现在时刻开始,再过Y秒后,时刻显示为Z, 我们的问题是:求最小的Y,使得时刻Z发亮的电子管数量与时刻X发亮的电子管数量相等。如:现在X = 99 ,那么再过Y = 5 秒后, 时刻变成了Z = 04, 而时刻Z发亮的电子管数量 = 6 + 4 = 10。于是Y = 5就是你要求的数。

Input

  第一行:一个整数N,表示电子表是10^N进制的。1 <= N <= 15。
  第二行:一个整数X, 表示现在的时刻,可能有前导0。X有N位数字。

Output

  一行:最小的整数Y, 表示从现在X时刻开始,再过Y秒,得到的时刻Z发亮的电子管数量与时刻X发亮的电子管数量相等。

Sample Input

3
007

Sample Output

11

Data Constraint

Hint

【样例说明】
  因为数字007有6+6+3 =15根电子管发亮,所以过11秒后,电子表显示数字018时,才能满足发亮的电子管数量相等。018时刻发亮的电子管数量 = 6 + 2 + 7 = 15

【数据说明】
  对于30%数据,N < 7.
想法:
sum[i]为数i需要的电子管
贪心,从后往前找到一个可修改的合法位置
设bz[i,j]为给你i个数,电子管数和为j是否可行
可修改的话枚举j,a[i]+1~9,判断bz[n-i,sum1-sum[a[i]]];sum1=sum[a[i~n]]的和
b[1~i-1]=a[1~i-1]
b[i]=最小的合法j
剩下i+1~n求法类似,找一个最小的合法j
最后求差
还可以用数位DP,dfs,折半,中途相遇法Orz%%%%

T3jzoj1303. 骑士

Description

  用字符矩阵来表示一个8x8的棋盘,’.’表示是空格,’P’表示人质,’K’表示骑士。
  每一步,骑士可以移动到他周围的8个方格中的任意一格。如果你移动到的格子中有人质(即’P’),你将俘获他。但不能移到出棋盘或当前是’K’的格子中。
  请问最少要移动多少步骑士才能俘获所有的人质。

Input

  第一行一个整数N(<=5),表示有多少个棋盘。即多组测试数据。
  每一组有8行,每行8个字符。字符只有’.’,大写’P’,大写’K’三种字符。’P’和’K’的个数范围都在[1,10]。

Output

  有N行,每行只一个整数,相应棋盘俘获全部人质所需要的最少步数。

Sample Input

输入1:
1
.PPPPKP.
……..
……..
……..
……..
……..
……..
……..

输入2:
2
P……P
……..
……..
……..
…KK…
……..
……..
P……P
…..P.P
..K….P
….K…
..PP…P
…K..KK
……..
K…….
KP.K….
想法:
状压DP
设dis2[i,j]表示第i个骑士去第j个俘虏的最小步数(横坐标差,纵坐标差的最大值)
dis1[i,j]表示第i个俘虏去第j个俘虏的最小步数
h[i,s]表示第i个俘虏,去抓其他俘虏状态为s的最小步数
g[i,s]表示第i个骑士单独去抓俘虏,状态为s的最小步数
f[i,s]表示前i个骑士去抓俘虏,状态为s的最小步数
h[i,s]:=min(h[i,s],h[j,s-2^(j-1)]+dis1[i,j]);i属于s,j属于s,i<>j
g[i,s]:=min(g[i,s],h[j,s]+dis2[j,i]);j属于s
f[i,s]:=min(f[i,s],f[i-1,s-s1]+g[i,s1]);s1属于s,s表示第i个骑士去抓俘虏的状态

原创粉丝点击