方法:
贪心
想法:
对于一个没被照亮的点来说,最好是只占用路灯能照亮的区域的最左边,这样的话,能够最大化利用路灯的照亮区域,这种安装方式满足了两个要求,一是所有的路灯都被覆盖到了,只要当前位置没有被路灯覆盖,就立即安装路灯,二是最大程度减少了使用路灯的数量,没有浪费掉路灯能照亮的左侧区域,并且最好情况下能同时覆盖三个需要被照亮的点。
算法:
遍历一条路的同时维护两个变量,当前路灯能照亮的最远距离max_,当前已使用的路灯数量cnt,如果遇到的是'.',并且它还没有被照亮,说明此时不得不安装路灯,让cnt++,同时将路灯所能照亮的最远距离max_更新为当前位置+2。
复杂度分析:
时间复杂度:O(N),其中 N 是路灯长度,一次遍历。
空间复杂度:O(1),max_和cnt,常数的空间。
#include<bits/stdc++.h> using namespace std; int main() { int n,m; cin>>n; string road; for(int i=0;i<n;i++) { cin>>m>>road; int cnt=0,max_=-1; for(int j=0;j<m;j++) if(road[j]=='.'&&j>max_) { cnt++; max_=j+2; } cout<<cnt<<endl; } return 0; }