【引入】
贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择,也就是不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
解题思路:
1.建立数学模型来描述问题;
2.把求解的问题分成若干个子问题;
3.对每一子问题求解,得到子问题的局部最优解;
4.把子问题的局部最优解合成原来问题的一个解。
【题目】
1615: 找区间
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 281 Solved: 115
[Submit][Status][Web Board]
Description
在X轴上有n个闭区间,去掉尽可能少的区间使剩下的区间都不相交
Input
多组测试数据
第一行输入n(n<=1000)
接下来n行每行两个数a,b代表闭区间的两个端点。
(a,b<=1000000)
Output
输出最小的删除的区间数
Sample Input
3 10 20 15 10 20 15
Sample Output
2
【题解】
根据右边界做升序排序,每次作出的选择即为局部最优解,因为每一次的状态只依赖于前一次选取的状态,所以最后得到的结果为整体最优解。
【代码】
#include<bits/stdc++.h>
using namespace std;
struct q{
int a,b;
}f[1005];
bool cmp(q x,q y)
{
return x.b<y.b;
}
main()
{
int n,i;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
{
scanf("%d%d",&f[i].a,&f[i].b);
if(f[i].a>f[i].b) swap(f[i].a,f[i].b);
}
sort(f,f+n,cmp);
int ans=0,t=-1000005;
for(i=0;i<n;i++)
{
f[i].a>t?t=f[i].b:ans++;
}
printf("%d\n",ans);
}
}