区间选点问题(贪心)
2015-12-16 00:02
288 查看
问题描述:数轴上有n个闭区间[ai, bi]。取尽量少的点,使得每个区间内都至少含有一个点(不同区间内含的点可以是同一个)
分析:区间包含,小区间满足则大区间也一定满足,步骤和选择不相交区间相似,先对bi进行非上升排序,如果bi相等则保持ai从大到小排序(大区间包含)。从第一个区间开始,取最后一个点,因为取最后一个点可以笼罩的区域最多。然后思路同不相交区间,循环,若后一个区间的起始部分大于前一个满足区间的结束部分,则该区间的结束部分为后一个点的位置。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
struct demo1
{
int b, e;
};
demo1 demo[maxn];
bool cmp(demo1 a, demo1 b)
{
return a.e < b.e || a.e < b.e && a.b > b.b;
}
int main()
{
int t;
while(cin >> t)
{
int n;
while(cin >> n && n != 0)
{
int lastend, sum = 0;
for(int i = 0; i < n; i++)
{
scanf("%d%d", &demo[i].b, &demo[i].e);
if(demo[i].b > demo[i].e)
{
swap(demo[i].b, demo[i].e);
}
}
sort(demo, demo+n, cmp);
lastend = demo[0].e;
sum++;
for(int i = 1; i < n; i++)
{
if(demo[i].b > lastend)
{
sum++;
lastend = demo[i].e;
}
}
cout << sum << endl;
}
}
return 0;
}
这里相比选择不相交区间多了一个交换部分。
分析:区间包含,小区间满足则大区间也一定满足,步骤和选择不相交区间相似,先对bi进行非上升排序,如果bi相等则保持ai从大到小排序(大区间包含)。从第一个区间开始,取最后一个点,因为取最后一个点可以笼罩的区域最多。然后思路同不相交区间,循环,若后一个区间的起始部分大于前一个满足区间的结束部分,则该区间的结束部分为后一个点的位置。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
struct demo1
{
int b, e;
};
demo1 demo[maxn];
bool cmp(demo1 a, demo1 b)
{
return a.e < b.e || a.e < b.e && a.b > b.b;
}
int main()
{
int t;
while(cin >> t)
{
int n;
while(cin >> n && n != 0)
{
int lastend, sum = 0;
for(int i = 0; i < n; i++)
{
scanf("%d%d", &demo[i].b, &demo[i].e);
if(demo[i].b > demo[i].e)
{
swap(demo[i].b, demo[i].e);
}
}
sort(demo, demo+n, cmp);
lastend = demo[0].e;
sum++;
for(int i = 1; i < n; i++)
{
if(demo[i].b > lastend)
{
sum++;
lastend = demo[i].e;
}
}
cout << sum << endl;
}
}
return 0;
}
这里相比选择不相交区间多了一个交换部分。
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析