活动安排 (贪心)

题目出处
像这种已知各活动的起止时间,求能参加活动(兼容)的最大个数的问题,关键在于各活动的结束时间,依照结束时间将各活动(从小到大)排序,这样当一个活动结束时,可以立刻找出起始时间与这个活动结束时间间隔最小(或为0)且持续时间最短的活动,重复这个过程知道所有活动都已遍历。
附代码:

#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
ll A[1005][2];
int main(){
    ll n; cin>>n;
    for(int i=0;i<n;i++){
        ll a,b; cin>>a>>b;
        A[i][0]=a; A[i][1]=b;
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n-i-1;j++){
            if(A[j][1]>A[j+1][1]){
                int temp=A[j][1]; A[j][1]=A[j+1][1]; A[j+1][1]=temp;
                int t2=A[j][0]; A[j][0]=A[j+1][0]; A[j+1][0]=t2;
            }
        }
    }
    int k=1; int l=A[0][1];
    while(1){
        int flag=0;
        for(int i=0;i<n;i++){
            if(A[i][0]>=l){
                l=A[i][1]; k++; flag=1;
            }
        }
        if(!flag) break;
    }
    cout<<k<<endl;
}

发布了24 篇原创文章 · 获赞 2 · 访问量 466

猜你喜欢

转载自blog.csdn.net/chineseherofeng/article/details/104685382
今日推荐