您的位置:首页 > 其它

区间选点问题(贪心)

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;
}

这里相比选择不相交区间多了一个交换部分。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息