貪心算法
- 前言
- 一.什么是貪心算法
- 二.例題
- 1.合并果子
- 2.跳跳!
- 3. 老鼠和奶酪
前言
我會將一些常用的算法以及對應的題單給寫完,形成一套完整的算法體系,以及大量的各個難度的題目,目前算法也寫了幾篇,題單正在更新,其他的也會陸陸續續的更新,希望大家點贊收藏我會盡快更新的!!!
一.什么是貪心算法
總是只看眼前,并不考慮以后可能造成的影響,將一個最優決策變成多步決策過程,并在每步總是做出當前看起來是最好的選擇,它所做的選擇只是在某種意義上的局部最優選擇可想而知,并不是所有的時候貪心法都能獲得最優解,所以一般使用貪心法的時候,都要確保自己能證明其正確性。
二.例題
1.合并果子
洛谷P1090 [NOIP 2004 提高組] 合并果子
//使用優先隊列解決
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;int main() {priority_queue<int, vector<int>, greater<int>>p;//定義一個優先隊列且為小頂堆int n; cin >> n;for (int i = 0; i < n; i++) {//將每個數據填入優先隊列int a; cin >> a;p.push(a);}int sum = 0;//需要體力的總值while (p.size() > 1) {//當元素只有一個的時候意味著結束//將最小的兩個取出來進行合并int first = p.top();p.pop();int last = p.top();p.pop();//將合并的結果填入優先隊列int t = first + last;sum += t;p.push(t);}cout << sum;return 0;
}
2.跳跳!
洛谷P4995 跳跳!
//用列表解決
#include <iostream>
#include <list>
#include <cstdlib>
using namespace std;int main() {list<long long> s;//由于數據過大,需要用到long longint n; cin >> n;for (int i = 0; i < n; i++) {//將所有數據填入列表long long a; cin >> a;s.push_back(a);}s.sort();//將列表進行排序long long sum = 0;//消耗的總體力值long long first = 0;long long last = 0;while (s.size() > 0) {//當沒有元素結束last = s.back();s.pop_back();sum += (last - first) * (last - first);if (s.size() > 0) {//如果元素是奇數first = s.front();s.pop_front();sum += (last - first) * (last - first);}}cout << sum;return 0;
}
3. 老鼠和奶酪
力扣2611. 老鼠和奶酪
static int cmp(const void* pa, const void* pb) {//比較函數return *(int *)pa - *(int *)pb;
}int miceAndCheese(int* reward1, int reward1Size, int* reward2, int reward2Size, int k) {int sum = 0;//總值int diff[reward1Size];//兩只老鼠的差值for(int i = 0; i < reward1Size; i++){sum += reward2[i];//先將所有的奶酪給第二只老鼠吃diff[i] = reward1[i] - reward2[i];//計算出兩個老鼠的差值}qsort(diff, reward1Size, sizeof(int), cmp);//將差值排序for(int i = 1; i <= k; i++){sum += diff[reward1Size - i];//將差值填入總數}return sum;
}