昨天参加了网易在线评测,总体感觉还是比较刺激的,这算是笔者的第一次在线笔试吧,然后总体的感觉就是自己的知识还是太不足了,需要大量的积累才能“厚积薄发”,算了,废话不多说,直接上我遇到的这个“道路布灯”问题。
一条道路上有n格格子,每一个格子上都是一块区域,其中对于每一块格子,用x表示是亮着,不需要使用路灯,而对于.表示的是黑暗的,需要使用路灯将其照明,而对于布置在pos位置上的路灯,能够照亮pos - 1 和pos + 1 这个范围内的距离,给定一条道路上的情况,试给出最少的布灯数量。
例,输入xxx.x.xx...x.x.
输出应当为 一个整数 3
老实说,刚开始拿到题目的时候。是一脸懵逼的,真的是一点思路都没有,然后紧紧的想了那么几分钟,看到时间也不够了,就索性放弃了。后来完事儿之后,再次拿起这个题目,思路就来了。。。怪事儿。。。
说说我的思路吧,我的想法是因为道路的情况相当于是一个输入的string类型,而这个string类型,我们就是需要寻找一个最小的灯的数量,然后将整条道路照明,而每个路灯的照明范围是3,因此我的想法是,我弄一个宽度为3的窗口,然后在这条道路上滑动窗口,为了使得路灯最小,
那么我可以对窗口的最左端的那个元素进行判断——
- 如果它已经不需要照亮,那么我们直接将窗口向右移动一格,
- 如果需要照亮,因为一盏灯的能够照明3格,所以直接将窗口向右移动3格。
那么依照,这个思路,我开始写代码:
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char const *argv[])
{
string inputStr;
int count = 0;
cin >> inputStr;
for (int pos = 0; pos < inputStr.size(); )
{
// 如果三个中的最左边的那个不可点亮,那么就直接右移一格
if (inputStr[pos] == 'x')
{
++ pos;
}
// 剩下的采用类似滑动窗口的思想进行代码的书写
else if (inputStr[pos] == '.')
{
// cout << pos << endl;
pos += 3;
++ count;
}
}
cout << count << endl;
return 0;
}
运行结果如下:
xx...x..x...
3
....x.x.x.x.
4