1. 程式人生 > 遊戲資訊 >明日方舟愚人節活動63025分!(第一關)

明日方舟愚人節活動63025分!(第一關)

✅做題思路or感想

這題亦是一道貪心(這種題目不明所裡的一看上去迷糊的一般都是貪心)

難點有二:

  • 貪心策略
  • 如何實現貪心的策略

貪心策略

這裡的策略倒是很簡單:只要射的箭都是往氣球最重合的地方射,所用的數量就會最少

實現策略

這裡為了讓氣球能夠重合,所以要對原陣列進行排序。難點在於如何對一個二維vector排序呢(即是如何寫sort的cmp呢)。

  • 首先先明確,排序的規則是:對每個氣球的起始位置排序,即是對point[i][0]排序

  • 而後便確定了程式碼

    static bool cmp (vector<int>& a, vector<int>& b) {
            return a[0] < b[0];
        }
    
  • 這裡值得一說的是在力扣裡寫cmp,前面必須要加一個字首static

那如何確定氣球的最大重合區域呢?用兩個變數來表示就可以了

class Solution {
public:
    //寫sort的cmp
    static bool cmp (vector<int>& a, vector<int>& b) {
        return a[0] < b[0];
    }
    int findMinArrowShots(vector<vector<int>>& points) {
        //排序是找重合區間的條件
        sort(points.begin(), points.end(), cmp);
        //用兩個變數來表示重合區間
        //因為要用箭引爆氣球至少需要一支箭,所以這裡shotCount初始化為1
        int shotStart = points[0][0], shotEnd = points[0][1], shotCount = 1;
        for (int i = 0; i < points.size(); i++) {
            //這裡的if,else很有講究,氣球重合的狀況有很多!但是不重合的狀況只有一種
            //故這裡把簡單的寫在if中,複雜的直接交給else就好了
            if (shotEnd < points[i][0]) {	//如果前後氣球沒有交集
                shotCount++;	//把前面重合的氣球射爆
                //重新定義重合區間(或者這裡說是瞄準區間更合理點?)
                shotStart = points[i][0];
                shotEnd = points[i][1];
            } else {
                //更新重合區間,取交集
                shotStart = max(shotStart, points[i][0]);
                shotEnd = min(shotEnd, points[i][1]);
            }
        }
        return shotCount;
    }
};