1. 程式人生 > 實用技巧 >C++ 題解 | 阿里雲天池超級碼力線上程式設計大賽初賽 第一場

C++ 題解 | 阿里雲天池超級碼力線上程式設計大賽初賽 第一場

開學前的最後一次做演算法題吧,不知道開學後的複賽有沒有時間打了

不過能拿到一件阿里的紀念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;
    }
};