贪心算法(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;
} 

猜你喜欢

转载自www.cnblogs.com/wanna-acm/p/9992869.html