貪心算法
【主要內容】
找硬幣
活動安排問題
找硬幣
【題目描述】
有四種硬幣,分別是25分、10分、5分和1分,給顧客找六角三分。
【題解】
貪心策略是:從大到小找零即可。

1 #include<cstdio> 2 3 int coin[] = { 25 , 10 , 5 , 1 }; 4 int Num[4] ; 5 6 int main() 7 { 8 int n = 63 ; 9 for( int i = 0 ; n && i < 4 ; i++ ){ 10 Num[i] = n / coin[i] ; 11 n %= coin[i] ; 12 } 13 for( int i = 0 ; i < 4 ; i ++ ){ 14 printf("Coin %d: %d\n",coin[i],Num[i]); 15 } 16 17 return 0; 18 } 19 /* 20 Coin 25: 2 21 Coin 10: 1 22 Coin 5: 0 23 Coin 1: 3 24 */
活動安排問題
【題目鏈接】
https://www.acwing.com/problem/content/910/
【題目描述】
設有n個活動的集合E={1,2,3,…,n},所有的活動要求使用同一資源,而在同一時間內只有一個活動能使用這一資源,每個活動都有使用這一資源的開始時間si和結束時間fi,且si<fi。目標:要在所給的活動中,找出最大的相容的活動子集合。
【題解】
問題的本質為:最大不相交區間數量
貪心策略:先按右端點從小到大排序,再按左端點從小到大。證明過程在書本
【前置知識】
其實結構體排序不是第一次遇到,在python課上談及過Lambda按照關鍵排序,在C#課上也說過Lambda排序或重寫CompareTo方法。
其實C++提供了內置的Sort函數。
Sort( a , a + n , cmp )
第一個空填入,數組需要排序的首地址。
第二個空填入,數組需要排序的尾地址。
第三個空填入,傳入排序的比較的方式。
我們只需要以這種形式調用,且重寫排序的規則即可。

1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 5 const int N = 1e5 + 10; 6 typedef struct Node { 7 int S , F ; //Start , Finish 8 }Node ; 9 Node a[N] ; 10 int n ; 11 int cmp( Node u , Node v ){ 12 if( u.F == v.F ){ 13 return u.S < v.S ; 14 } 15 return u.F < v.F ; 16 } 17 18 int main() 19 { 20 21 scanf("%d",&n); 22 for( int i = 0 ; i < n ; i ++ ) scanf("%d%d",&a[i].S , &a[i].F ); 23 sort( a , a + n , cmp ); 24 25 26 int ans = 1 , End = a[0].F ; 27 for( int i = 1 ; i < n ; i++ ){ 28 if( End < a[i].S ){ 29 End = a[i].F ; 30 ans ++ ; 31 } 32 } 33 printf("%d\n",ans); 34 return 0 ; 35 }