4377 农田灌溉(枚举)

1. 问题描述:

农夫约翰有 n 片连续的农田,编号依次为 1∼n。其中有 k 片农田中装有洒水器,装有洒水器的农田的编号从小到大依次为 x1,x2,…,xk,在某个炎热的中午,约翰觉得是时候给他的所有农田浇水了。每个洒水器在打开以后,向两侧方向洒水,并且随着开启时间延长,有效覆盖距离也不断增长。具体来说,我们将第 xi 片农田中的洒水器打开,经过 1 秒后,第 xi 片农田被其覆盖,经过 2 秒后,第 [xi−1,xi+1] 片农田被其覆盖,经过 j 秒后,第 [xi−(j−1),xi+(j−1)] 片农田被其覆盖。注意,每个洒水器的有效覆盖距离在每经过整数秒后,才会有所增长。例如,经过 2.5 秒后,被第 xi 片农田中的洒水器覆盖的农田仍是第 [xi−1,xi+1] 片农田,而不是第 [xi−1.5,xi+1.5] 片农田。现在,约翰将所有洒水器同时打开,请问经过多少秒后,所有农田均被灌溉。

输入格式

第一行包含整数 T,表示共有 T 组测试数据。每组数据第一行包含两个整数 n,k。第二行包含 k 个整数 x1,x2,…,xk。

输出格式

每组数据输出一行答案。

数据范围

前三个测试点满足 1 ≤ n ≤ 5,
所有测试点满足 1 ≤ T ≤ 200,1 ≤ n ≤ 200,1 ≤ k ≤ n,1 ≤ xi ≤ n,xi−1 < xi,T 组数据的 n 相加之和不超过 200。

输入样例:

3
5 1
3
3 3
1 2 3
4 1
1

输出样例:

3
1
4
来源:https://www.acwing.com/problem/content/4380/

2. 思路分析:

分析题目可以知道我们可以使用二分来解决,二分枚举答案判断当前时间范围内是否可以将所有的农田灌溉,除了二分的方法之外,可以发现我们枚举出每一块农田什么时候洒上水,进一步可以发现最长的时间应该是两个洒水器中间农田的灌溉时间,所以求解中间农田灌溉需要的时间即可,也即 (x + y) / 2 位置对应的农田灌溉的时间,当 x + y 可以整除 2 的时候那么中间农田灌溉的时间为 x + y 除以 2 向下取整,当不能够整除 2 的时候那么中间靠左的农田由左边灌溉,中间靠右的农田由右边灌溉,所以灌溉的时间也是 x + y 除以 2 向下取整,对于第一个和最后一个农田需要特判一下,我们找一下规律就可以知道第一个农田的灌溉时间为 p[0],最后一个农田灌溉时间为 n + 1 - p[m],枚举的时候维护一个最大值即可。 

3. 代码如下:

class Solution:
    def process(self):
        T = int(input())
        for c in range(T):
            n, m = map(int, input().split())
            p = [0] + list(map(int, input().split()))
            res = max(p[1], n + 1 - p[m])
            for i in range(1, m):
                # 由于是对应秒数才洒上水, 所以答案需要加上1
                res = max(res, (p[i] + p[i + 1]) // 2 - p[i] + 1)
            print(res)


if __name__ == '__main__':
    Solution().process()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值