算法期末備考-第6練-貪心算法


算法期末備考-第6練

貪心算法

【主要內容】

找硬幣

活動安排問題

 


找硬幣

【題目描述】

有四種硬幣,分別是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 }
活動安排問題

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM