题面:
有一个长度为n的花园,一共有k个水龙头,分别在x[1],x[2]...x[k]的位置。第t秒每个水龙头可以浇灌到它的前第t个方格和它后第t个方格,问浇灌完花园的时间。
分析:
首先把水龙头所在的位置设成1,其余的设成0.再枚举浇灌的时间,被浇过的地方都设成1,所有都是1时结束。 上代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
int n;
cin>>n;
int i,s,x,j,c,p,h,cnt;
for (i=1;i<=n;i++)
{
cin>>s>>x;
int f[s+1],t[x+1],a[s+1];//f数组为标记数组
for (j=1;j<=s;j++)
{
f[j]=0;//没有水龙头的位置设成1
}
for (j=1;j<=x;j++)
{
cin>>t[j];
f[t[j]]=1;//把水龙头所在的位置设成1
}
c=0;
p=0;
h=0;
for (j=1;j<=s;j++)
{
if (f[j]==0)
{
p=1;
}
}
if (p==0)
{
h=1;
}
while (p==1)
{
p=0;
c++;//c表示时间
cnt=0;
for (j=1;j<=s;j++)
{
if (f[j]==1)
{
cnt++;
a[cnt]=j;
}
}
for (j=1;j<=cnt;j++)
{
f[a[j]+1]=1;
f[a[j]-1]=1;
}
for (j=1;j<=s;j++)
{
if (f[j]==0)
{
p=1;
}
}
}
if (h==1)
{
cout<<"1"<<endl;//如果全都是水龙头,直接输出1
}
else
{
cout<<c+1<<endl;//否则输出时间+1
}
}
return 0;
}