松雅的花园
【问题描述】
冬天到了,松雅觉得是时候给她的花园浇水了。
她的花园由 n 个连续的苗圃组成,编号从 1~n。其中的 k 个苗圃安装有水龙头(第 i 个水龙头位于苗圃 xi),当水龙头打开的时候,可以同时给相邻的苗圃浇水。1个时间单位后,她可以给苗圃 xi 浇好水,2个时间单位后,她可以给 [xi-1, xi+1] 范围内的苗圃(如果有)浇好水,在 j 个时间单位后,她可以给[xi-(j-1),xi+(j-1)]内的苗圃(如果有)浇好水。
图中白色表示该苗圃没有水龙头,红色表示该苗圃有一个水龙头
水龙头打开2个时间单位后,白色部分表示没有浇到水的苗圃,蓝色部分表示已浇水的苗圃
松雅希望在同一时刻打开所有水龙头,她想知道,最少到多少个时间单位以后整个花园都能浇好水。
【输入形式】
第一行一个整数表示测试数据的组数。 接下来T组测试数据 ,每组数据的第一行包含两个整数 n 和 k,分别表示她的花园中的苗圃数和水龙头数,接下来的一行为 k 个整数 xi,表示第 i 个水龙头所在的位置,输入保证对于每个 i >=2,xi - 1 < xi 。 本题只考虑整数单位时间。
【输出形式】
对于每个测试用例,每个用例输出一行一个整数,表示所有水龙头同时打开后整个花园浇好水所需要的最小时间单位数。
【样例输入】
3
5 1
3
3 3
1 2 3
4 1
1
【样例输出】
3
1
4
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,i,j,t=0,m;
cin>>n;
int a[n+1][3],d[n+1];
for(i=1;i<=n;i++)
{
cin>>a[i][1]>>a[i][2];
int b[a[i][2]+1],c[a[i][2]+1];
b[0]=0;
for(j=1;j<=a[i][2];j++)
{
cin>>b[j];
t++;
c[t]=b[j]-b[j-1];
}
m=max(b[1],a[i][1]-b[a[i][2]]+1);
for(j=1;j<=t;j++)
{
if(c[j]/2+1>m)m=c[j]/2+1;
}
d[i]=m;
t=0;
}
for(i=1;i<=n;i++)
{
cout<<d[i]<<endl;
}
return 0;
}