问题标题: 酷町堂:2777 区间合并

0
0
已解决
贾一凡
贾一凡
中级光能
中级光能

题目描述 Description
区间是指具有左端点和右段点的,在左端点和右端点间所有数的集合。例如(2, 6)就是指2到6之间的所有数。现在给你n个区间,请你将它们合并成尽可能少的区间。区间合并的规则是,如果两个区间有公共部分,或者端点相连,则可以变成一个更大的区间。

输入描述 Input Description
第一行,一个整数,n,表示有n个区间
接下来n行,每行两个整数,a b,表示区间(a, b)

输出描述 Output Description
一个整数,表示合并之后还剩多少个区间

样例输入 Sample Input
4
1 5
2 4
1 4
2 3
样例输出 Sample Output
1
数据范围及提示 Data Size & Hint
n≤100

 

Wrong Answer

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
struct qj{
    int l,r;
}a[1005],tmp;
int n,ans=1;
bool cmp(qj x,qj y){
    return x.l<y.l;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        int x,len;
        cin>>x>>len;
        a[i].l=x-len;
        a[i].r=x+len;
    }
    sort(a+1,a+n+1,cmp);
    tmp=a[1];
    for(int i=2;i<=n;i++){
        if(a[i].l<=tmp.r){
            tmp.l=a[i].l;
            tmp.r=max(tmp.r,a[i].r);
        }else{
            ans++;
            tmp=a[i];
        }
    }
    cout<<ans;
    return 0;
}

 

大佬们找错!

贾一凡在2022-07-21 14:38:44追加了内容

结帖!


0
已采纳
王文博
王文博
缔造者之神
缔造者之神

本题可以算作是一道区间问题的贪心题目

首先输入是直接输入,不需要进行操作

然后cmp函数是对的

最后的循环部分只需要用一个变量t即可,不需要结构体,反而会变得复杂

要从1循环到n,如果a[i].l>t,需要改变t的值,并且增加计数器,与此同时t还要取max(无论符不符合条件)

0
我要回答