您的位置:首页 > 其它

HDU 2037 今年暑假不AC (贪心)

2012-08-20 21:17 183 查看
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2037

这道题大意就不解释了,关键是这道题目的解法

我们在这里使用的是贪心

在贪心中,有一种便是这种活动安排的题型

以下便是关于这类题型的解释:

活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子。该问题要求高效地安排一系列争用某一公共资源的活动。贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源
设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi 。如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。

首先我们要做的就是,根据结束时间,对储存开始时间和结束时间的两个数组进行排序。
然后用我们的贪心算法,慢慢的算出最优解。

AC代码如下:
(这里使用了结构体,比较方便排序)

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
struct Node
{
int s;
int f;

};
int n;
Node temp[1000];
int Count;
bool cmp(Node a,Node b)
{
return a.f<b.f;

}
void greedySelector()
{
int i,j=1;
for(i=2;i<=n;i++)
{
if(temp[i].s>=temp[j].f)
{
j=i;
Count++;
}
}

}
int main()
{
int i;
while(scanf("%d",&n))
{
if(n==0)
break;
for(i=1;i<=n;i++)
scanf("%d %d",&temp[i].s,&temp[i].f);
sort(temp,temp+n,cmp);
Count=1;
greedySelector();
printf("%d\n",Count);

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: