C++ 題解 | 阿里雲天池超級碼力線上程式設計大賽初賽 第一場
阿新 • • 發佈:2020-08-29
開學前的最後一次做演算法題吧,不知道開學後的複賽有沒有時間打了
不過能拿到一件阿里的紀念T恤還是蠻開心的,賽題也很友好,適合我這種養老選手~
樹木規劃
描述
在一條直的馬路上,有 \(n\) 棵樹,每棵樹有一個座標,代表它們距離馬路起點的距離。 如果每相鄰的兩棵樹之間的間隔不小於\(d\) ,那麼我們認為這些樹是美觀的。 請計算出最少移除多少棵樹,可以讓這些樹變得美觀。
樹木的棵樹為 \(b\),\(1\le n\le 10^5\)。 樹木的座標用 \(trees\) 表示,\(0\le tresss_i\le 10^9\)。 最小美觀間隔為 \(d\) ,\(1\le d\le 10^9\)。 保證輸入的座標是排好序的,且兩兩不相同。
說明
樣例中,將位置 \(2\) 和 \(6\) 的樹木移走,剩下 \([1,3,5]\) ,它們是美觀的。
示例
輸入:
[1,2,3,5,6]
2
輸出:
2
——————————————————————————————————————————————
第一道難度不會太大,解題目標是 “移除樹數量最小” ,換言之就是 “保留樹數量最大”
於是很自然想到首先儲存每棵樹的原定座標到陣列,然後貪心地遍歷保留各種較多的樹
貪心的策略是:首先選取最靠左的樹,然後在美觀的條件下向右選擇最近的樹並保留
程式碼如下
class Solution { public: /** * @param trees: the positions of trees. * @param d: the minimum beautiful interval. * @return: the minimum number of trees to remove to make trees beautiful. */ int treePlanning(vector<int> &trees, int d) { int n=(int)trees.size(),cnt=1,now=trees[0]; for (int i=1;i<n;i++) if (now+d<=trees[i]) cnt++,now=trees[i]; return n-cnt; } };