网易笔试第一题,思考了一会儿把自己给绕进去了,想明白了不难
![](https://i-blog.csdnimg.cn/blog_migrate/280aa19fa1ac6ab68fc2ed1885457c10.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9e96690d3f55f1a8d5d3b919d5fa0492.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cca9c4d70a5997e3e22fdb7c12ae1c16.png)
分两种情况讨论:
1、<=3的情况,有需要被照亮的地方则安装1个路灯即可
2、>3的情况,从第二个格子开始遍历(i=1),去寻找需要被照亮的格子(这里看当前格子的前一个格子i=0是否需要被照亮),如果i=0需要被照亮,并且i=0的格子没有被照亮,在当期位置放置路灯,同时照亮i-1、i、i+1三个格子,如果不需要被照亮,则i++即可。代码分享,大家可以讨论
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
void Calcul()
{
const int MAXLENTH = 1000;
int n;
char str[MAXLENTH];
int sum=0,light[MAXLENTH+1] = {0};
cin>>n;
cin>>str;
if(n<=3)
{
for(int i=0;i<n;i++)
if('.' == str[i])
{
cout<<1<<endl;
return;
}
cout<<0<<endl;
return;
}
for(int i=1;i<n;i++)
{
if('.' == str[i-1] && 0 == light[i-1])
{
sum++;
light[i-1] = 1;
light[i] = 1;
light[i+1] = 1;
}
}
if('.' == str[n-1] && 0 == light[n-1])
sum++;
cout<<sum<<endl;
return;
}
int main()
{
/**网易第一题*/
int k;
cin>>k;
for(int i=0;i<k;i++)
Calcul();
return 0;
}