在新的一本书中又开始了对贪心算法的学习。此次学习中主要学习应用的部分是区间贪心。
在这一部分贪心的目的是要求区间利用的最大化,例题来说主要解决的方法便是尽可能的选择耗费时间少的区间,但在贪心时,如果有规律可循,那么只要区间时间不重合排列那么就是可以的。同样贪心对每个题的算法都不同,更多的还是自己适应不同的题目方式找规律。
活动安排例题思路:首先把每个区间的右端点进行排序,然后在选择区间时,选择与前一个最近并不重合的区间,最后求出总值。
题目:
设有 n 个活动的集合 E={1,2,..,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si<fi。如果选择了活动i,则它在时间区间[si,fi)内占用资源。若区间[si,fi)与区间 [sj,fj)不相交,则称活动i与活动j是相容的。也就是说,当fi≤sj或fj≤si时,活动i与活动j相容。选择出由互相兼容的活动组成的最大集合。
输入
第一行一个整数 n(n<=1000);接下来的 n 行,每行两个整数 si 和 fi。
输出
输出尽可能多的互相兼容的活动个数。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
struct hou
{
int s,m;
}a[1005];
bool cmp(hou x,hou y)
{
return x.m <y.m;
}
int main()
{
int t,n,sum=1;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].s ,&a[i].m);
}
sort(a+1,a+n+1,cmp);
t=a[1].m;
for(int i=2;i<=n;i++)
{
if(a[i].s >=t)
{
sum++;
t=a[i].m;
}
}
printf("%d",sum);
}