昨天參加了網易在線評測,總體感覺還是比較刺激的,這算是筆者的第一次在線筆試吧,然後總體的感覺就是自己的知識還是太不足了,需要大量的積累才能“厚積薄發”,算了,廢話不多說,直接上我遇到的這個“道路布燈”問題。
一條道路上有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