贪心算法——线段覆盖问题

96 阅读1分钟
#include <algorithm>
using namespace std;
struct S //创建结构体,对于排列其起点比较简便,因为终点要随起点一同变换
{
    int start; //线段起点
    int end;   //线段终点
};
S x[100];
bool cmp(S a, S b) //将起点按从小到大排列,如果起点相同时比较其终点,终点小者在前
{
    if (a.start < b.start) //比较起点
        return true;
    else
    {
        if (a.start == b.start)
        {
            if (a.end < b.end) //比较终点
                return true;
        }
    }
    return false;
}
int main()
{
    int i, j, n, sum = 0, last;
    cin >> n;
    for (i = 0; i < n; i++)
        cin >> x[i].start >> x[i].end; //输入多个线段
    sort(x, x + n, cmp);
    sum = x[0].end - x[0].start; // sum是最终覆盖长度
    last = x[0].end;             // last是当前总长度的末尾坐标
    for (i = 0; i < n; i++)
    {
        if (x[i].start >= last)
            sum += x[i].end - x[i].start; // 起点大于last则直接加上线段长
        else if (x[i].end > last)
            sum += x[i].end - last; // 起点小于last,终点大于last,加上多出部分
        last = x[i].end;            // last保持更新
    }
    cout << endl << sum << endl;
    return 0;
}