小试4

来源:互联网 发布:安大略理工大学知乎 编辑:程序博客网 时间:2024/06/06 21:45

Noip2017模拟赛4(B组)

题目名称

最小距离

海战

覆盖墙壁

倒水

存盘文件名

dis

battle

wall

Water

输入文件名

dis.in

battle.in

wall.in

water.in

输出文件名

dis.out

battle.out

wall.out

water.out

时限

1s

1s

1s

1s

内存限制

64M

64M

128M

64M

注意事项:请自行完成题目,切勿讨论。

 

题1  最小距离

【问题描述】

    栋栋有两个相同长度的字符串A和B,它们的长度都为n。为了了解这两个字符串的相似性,栋栋定义了一个A和B之间的距离函数:对于两个字母,它们的距离定义为它们的ASCII码之间的差的绝对值;对于两个串,它们的距离定义为它们的所有对应位置上的字母的距离之和。

    如串A="abcd",B="aaaa",则A与B的距离为0+1+2+3=6。

    给出串A和B,栋栋想把A中的正好K个字母变为其他的字母,使变化后的串与B的距离最小。

【输入格式】

    输入文件dis.in中的前两行每行一个字符串,分别表示串A和串B。A和B一定是等长的,而串中的每个字母一定是'a'-'z'中的一个。

    输入文件第三行为一个正整数k,表示要修改A中的多少个字母。

【输出格式】

    输出到dis.out中,仅一个数,表示A修改k个字母后与B的距离的最小值。

【输入样例1】

   aaa

   baz

    1

【输出样例1】

    1

 

【输入样例2】

   aa

   aa

    2

【输出样例2】

    2

 

【样例说明】

    样例1中,把A的最后一个字母a改为z即可。

    样例2中,A的两个字母都需要修改,都改为b后距离为2。

【数据规模】

   1<=k<=A,B的长度<=50

 

 

 

题2  海战

【问题描述】

    在峰会期间,武装部队得处于高度戒备。警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机。此外,巡洋船只和舰队将被派去保护海岸线。不幸的是因为种种原因,国防海军部仅有很少的几位军官能指挥大型海战。因此,他们考虑培养一些新的海军指挥官,他们选择了“海战”游戏来帮助学习。

    在这个著名的游戏中,在一个方形的盘上放置了固定数量和形状的船只,每只船却不能碰到其它的船。在这个题中,我们仅考虑船是方形的,所有的船只都是由图形组成的方形。编写程序求出该棋盘上放置的船只的总数。

 

【输入格式】

    输入文件头一行由用空格隔开的两个整数R和C组成,1<=R,C<=1000,这两个数分别表示游戏棋盘的行数和列数。接下来的R行每行包含C个字符,每个字符可以为“#”,也可为“.”,“#”表示船只的一部分,“.”表示水。

 

【输出格式】

    为每一个段落输出一行解。如果船的位置放得正确(即棋盘上只存在相互之间不能接触的方形,如果两个“#”号上下相邻或左右相邻却分属两艘不同的船只,则称这两艘船相互接触了)。就输出一段话“There are S ships.”,S表示船只的数量。否则输出“Bad placement.”。

 

【输入样例】battle.in

     6 8
     .....#.#
     ##.....#
     ##.....#
     .......#
     #......#
     #..#...#

 

【输出样例】battle.out

     There are 5 ships.

 

        第3题:覆盖墙壁(wall)

【题目描述】

你有一个长为N宽为2的墙壁,给你两种转头:一个长2宽1,另一个是L型覆盖3个单元的转头。如下图:

 

 

 

 

 

 

 


转头可以旋转,两种转头可以无限制提供。你的任务是计算用这两种来覆盖N*2的墙壁的覆盖方法。例如一个2*3的墙可以有5种覆盖方法,如下:

注意可以使用两种转头混合起来覆盖,如2*4的墙可以这样覆盖:

给定N,要求计算2*N的墙壁的覆盖方法。由于结果很打,所以只要求出输出最后4位。例如2*13的覆盖方法为13465,只需输出3465即可。如果答案少于4位,就直接输出就可以,不用加0,如N=3时输出5.               

【输入格式】

一个整数N(1<=n<=100 0000),表示墙壁的长。

【输出格式】

输出覆盖方法的最后4位,如果不足4位就输出整个答案。

【样例输入】

13

【样例输出】

3465

 

题4  倒水

【问题描述】   

    一天辰辰买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水。接着辰辰发现瓶子实在太多了,于是他决定保留不超过K个瓶子,每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃(不能丢弃有水的瓶子)。

    显然在某些情况下辰辰无法达到目标,比如N=3,K=1。此时辰辰会重新购买一些新的瓶子(新瓶子容量无限,开始时有1升水)以达到目标。

    现在辰辰想知道最少需要多少新瓶子才能达到目标呢?

    输入文件一行两个正整数N和K,其中1<=n<=10^9,k<=1000。

输出文件包含一个非负整数,表示最少需要购买的瓶子数量。

【输入样例1】

3  1

【输出样例1】

1

【输入样例2】

13  2

【输出样例2】

3

【输入样例3】

1000000 5

【输出样例3】

15808

 

【数据规模】

对于50%的数据,n<=10^7;对于100%的数据如题目。

【提示】考虑lowbit运算