貪心演算法(又稱貪婪演算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,演算法得到的是在某種意義上的區域性最優解。
核心的處理在於:最優子結構的存在,即部分最優解合起來是整體最優解。
以題目進行分析:
p7095 [yloi2020] 不離
ps首先感謝一下寫題解的大佬,我一開始是真的不會做,按照它的**慢慢摸索在,終於會了。
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
#define rg register int
#define ll long long
#define ull unsigned long long
#define int long long
const
int maxn =
100010
;struct equipment
} equip[maxn]
;template
<
class
t>
inline
void
read
(t &x)
template
<
typename t>
inline
void
print
(t x)
priority_queue q;
bool
cmp(equipment a, equipment b)
signed
main()
sort
(equip, equip + number, cmp)
;int ans =
0, a =0;
for(
register
int i =
0; i < number; i++
) a = a + equip[i]
.padd;
}print
(ans)
;putchar
(' ');
int ans2 =
0, b =0;
//最小的穿戴精神要求與此時的精神,此時的力量
//我想要在ans已經確定的前提下利用優先對列進行做題,如何解決?
//為什麼不把ans設為初值呢?
for(
register
int i =
0; i < number; i++
) b = b + sadd;
ans +
= padd;
} q.
push
(equip[i]);
}if(i == number -1)
b = b + sadd;}}
}print
(ans2)
;system
("pause");
return0;
}//終於給我過了,哈哈哈哈哈
//難死我了= =
//掌握到了一些精髓
//貪心演算法中優先佇列的鑲嵌使用,通過sort獲得第一限制條件能夠得到的結果
//再通過priority_queue實現在第乙個限制條件下的第二個限制條件的完成
//拓展一下,如果要求有三個限制條件,又或者n個限制條件呢?
//在完成第二個限制條件後,以第乙個,第二個為約束條件進行搜尋即可,ok!
這道題目的核心問題,如何在第乙個限制條件,即保證初始力量最小的條件下篩選出初始精神最小。
對於這個問題,優先佇列是乙個非常好的辦法,其本身只有logn的複雜度,在內部設立乙個相對於篩選環境就行。
例題2:例題沒有了。。。
給定乙個n,下面有n個資料,每行有a,b,c三個數字,保證a+b+c>=0
求初始的資金c,能遍歷完全部的資料。
由於最後的值一定大於0,所以我們只需要通過每個資料的t=min(a,a+b)進行篩選就可以,我們要保證最小的啟動資金先被篩選到。
正在施工。。。。。。。。。。
總結 貪心演算法 貪心演算法入門總結
英語 greedy algorithm,又稱貪婪演算法,是一種在每一步選擇中都採取在當前狀態下最好或最優 即最有利 的選擇,從而希望導致結果是最好或最優的演算法。比如在旅行推銷員問題中,如果旅行員每次都選擇最近的城市,那這就是一種貪心演算法。貪心演算法在有最優子結構的問題中尤為有效。最優子結構的意思...
貪心演算法總結
第一套題主要用貪心演算法來解決問題,貪心演算法簡單來說就是從區域性最優解,進而求得整體最優解,其中難點就是選擇貪心標準,貪心標準的選擇選的巧妙問題就會變的很簡單,比如第一題搬桌子的題,就是把房間轉化為對應的走廊號,問題就簡化了很多。貪心演算法的題目有的可以很簡單的看出來,常見典型的題有,揹包問題,最...
貪心演算法總結
在求最優解問題的過程中,依據某種貪心標準,從問題的初始狀態出發,直接去求每一步的最優解,通過若干次的貪心選擇,最終得出整個問題的最優解,這種求解方法就是貪心演算法。從貪心演算法的定義可以看出,貪心演算法不是從整體上考慮問題,它所做出的選擇只是在某種意義上的區域性最優解,而由問題自身的特性決定了該題運...