1. 程式人生 > >貪心演算法(1)—— 活動安排問題 以及 電視節目問題 的區別

貪心演算法(1)—— 活動安排問題 以及 電視節目問題 的區別

一、活動安排問題

#include <iostream>
#include <algorithm>
using namespace std;

/*
    題目型別:活動安排問題
    特點:所有活動都需要進行,要求輸出所需的會場數
    演算法:貪心演算法
    注意事項:比較排序時,按照活動開始時間由小到大排序
    原因:因為所有項都需要包括時,所以按照上述排序方式,活動排布更加緊湊,可節省會場數
    樣例:
    (Input)
    4
    1 3
    2 4
    4 5
    3 9
    (Output)
    2
*/ struct activity { int start; int end; }act[1005]; //記錄活動的開始和結束時間 int num[1005]; //記錄各會場的結束時間 bool compare(activity a,activity b) { return a.start<b.start; } int main() { int n; //記錄活動個數 cin>>n; for(int i=0;i<n;i++) { cin>>act[i].start>>act[i].end; } sort(act,act
+n,compare); //把活動按開始時間由小到大排序 int l=0; //記錄所需會場數 num[l++]=act[0].end; //第一場活動開始,記錄第一會場的結束時間 for(int i=1;i<n;i++) { bool flag=false; //記錄第i個活動的狀態——是否已安排會場 for(int j=0;j<l;j++) { if(act[i].start>=num[j]){ //若第i個活動的開始時間大於第j個會場的結束時間,則該活動可安排在該會場舉行
//此時需修改第i個活動的狀態,和第j個會場的結束時間,同時跳出該迴圈,進入下一個活動 flag=true; num[j]=act[i].end; break; } } if(flag==false) num[l++]=act[i].end; //如果第i個活動與已有的所有會場進行比較後,仍未找到合適的會場,則新開一個會場用於舉辦該活動 } //當所有活動皆已完成比較後,即可輸出現有的會場數 cout<<l<<endl; return 0; }

二、電視節目問題

#include <iostream>
#include <algorithm>
using namespace std;

/*
    題目型別:電視節目問題
    特點:不一定包括所有項,求能完整看完的最多節目個數
    演算法:貪心演算法
    注意事項:比較排序時,按照節目結束時間從小到大排序
    原因:因為並不一定包含所有節目,所以按照上述排序方式,每次選擇完節目後都可以留下較多的剩餘時間
    樣例:
    (Input)
    7
    1 3
    3 4
    2 9
    3 8
    10 15
    5 10
    4 14
    (Output)
    4
*/ 

struct program {
    int start;
    int end;
}pro[1005]; //記錄節目的開始和結束時間 

bool compare(program a,program b) {
    return a.end<b.end;
}

int main() {
    int n; //記錄節目總個數 
    cin>>n;
    for(int i=0;i<n;i++) {
        cin>>pro[i].start>>pro[i].end;
    }
    
    sort(pro,pro+n,compare); //把節目按結束時間由小到大排序
    
    int endtime=pro[0].end; //記錄看完所選節目單內節目的時間 
    int num=1; //記錄選擇的節目個數
    for(int i=1;i<n;i++) {
        if(pro[i].start>=endtime){
        //若第i個節目的開始時間大於節目單的結束時間,則該節目可加入到節目單 
        //此時需修改節目單的結束時間,以及所選節目個數 
            endtime=pro[i].end;
            num++;
        }
    }
    //當所有節目皆已完成比較後,即可輸出所選節目單中的節目數 
    cout<<num<<endl;
    return 0;
}