Leetcode 排序 優先佇列 貪心

2022-09-11 12:27:14 字數 2412 閱讀 5414

有一類題,像有n個任務,n個會議,n顆樹,要你按一定的順序執行,使得總用時最少等,通常都需要想乙個貪心策略,然後排序,再用優先佇列逐一處理。

當然貪心是需要證明的,可以先找到乙個序,然後證明交換任意兩項不會更優。然而比賽的時候更多靠直覺。

題意:有n顆植物,每顆植物需要先播種planttime[i]天(不要求連續),再生長growtime[i]天,然後開花,求使所有植物開花的最短時間。

方法:直接說結論:按growtime從大到小排序(感性認識就是,growtime越大提供的plantime的位置也越多,反正plantime也不要求連續,總能將growtime帶來的空位填滿)

比賽的時候我猜的growtime-planttime,不一定最優,看來是完全不用考慮planttime

畫流水線圖,與每行取max

class solution 

sort(vec.begin(), vec.end(), (pair& a, pair& b) );

int res = vec[0].first + vec[0].second;

int sum = 0;

for(int i = 0;i < vec.size();i++)

}return res;

}};

題意:n個任務,每次取可行任務中執行時間最短的執行

方法:先按開始時間排序,列舉時間,每次將能開始的加入佇列中,並取隊首執行

class solution 

};vectorgetorder(vector>& tasks)

sort(tasklist.begin(), tasklist.end(), (task& a, task& b) );

/*2. processingtime 短作業優先*/

auto cmp = (const task& a, const task& b) ;

priority_queue, decltype(cmp)> pq(cmp);

int n = tasklist.size();

long long curtime = 0; /* 3. 列舉時間 */

int idx = 0;

vectorans;

int cnt = 0;

while(cnt < n)

}return ans;

}};

方法:和上面一題非常類似,也是先能放就放,然後取最大的執行,直到取到k個任務。

class solution );

sort(tasks.begin(), tasks.end());

priority_queuepq;

int cnt = 0;

int i = 0, curw = w;

while(i < n || (!pq.empty())) else

}return curw;

}};

方法:按工作效率從大到小排序,這樣列舉到的每個效率值都是當前最小值。與此同時,將速度用乙個大小為k的最小堆維護.

class solution );

sort(engineers.begin(), engineers.end(), greater()); // efficiency從大到小

long long cnt = 0, ans = 0, sum = 0;

priority_queue, greater>pq;

for(int i = 0;i < n;i++)

else

}ans = max(ans, engineers[i].first * sum); // 相當於列舉了最小效率值

}return (int)(ans % mod);

}};

方法:從前往後,維護乙個大小為ladders的堆,且磚塊也不夠用時返回

class solution  // 大於梯子數就每次換個最小的出來

if(bricks < 0) return i;

i++;}}

return i;

}};

方法:負數才要反轉,維護k個最小的負數,如果k有剩餘就去修改絕對值最小的那個數

class solution 

priority_queue, greater>pq;

int cur_sum = 0;

for(int num : nums)

else

} }

}// cout << sum << " " << cur_sum << endl;

int ans = sum + 2*cur_sum;

if((k - pq.size()) % 2 == 1)

return ans;

}};

Leetcode優先佇列 雙端佇列 堆排序 桶排序

class solution for int i 0 i k i return res class solution while q.empty nums q.back nums i q.push back i if i k 1 i為下標,k為長度,需要減1 res.push back nums q...

HDU 6709 CCPC網路賽H 優先佇列 貪心

題意 n條魚在河裡,每次花k的時間抓一條,每次只能在鍋裡煮一條,時間是ti,把魚丟進鍋裡是瞬間的,抓魚必須是連續k的時間,魚在煮的時候可以去抓魚,求煮完的最短花費時間 又是乙個用優先佇列反悔的貪心。這種貪心一般就是套路,先一直選決策a,再把決策b的情況丟進優先佇列,不能進行決策a的時候就從優先佇列取...

優先佇列自動排序

優先佇列自動從從小到大排序,我也是看不懂啊 本來打算用哈夫曼樹的,完全符合裡面的wpl 葉子節點的帶權路徑長度之和 可是不會寫 啊!題目描述 description 在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩...