zcmu 1615: 找区间(贪心)

【引入】

贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择,也就是不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

解题思路:

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

猜你喜欢

转载自blog.csdn.net/qq_41117236/article/details/81153752