C++ 1236 区块合并 自己测试数据正确但测试点错误

题目:
http://ybt.ssoier.cn:8088/problem_show.php?pid=1236
1236 区间合并

代码:


#include<bits/stdc++.h>
using namespace std;
struct S
{
    int begin,end;
}l,ll;
bool cmp(S a,S b)
{
    if(a.begin!=b.begin) return a.begin >b.begin;
    else return a.end>b.end;
}
struct stack
{
    S data[10001];
    int len;
    void In(S x)
    {
        len++;
        data[len]=x;
    }
    S Out()
    {
        len--;
        return data[len+1];
    }
}X;
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>l.begin>>l.end;
        X.In(l);
    }
    sort(X.data+1,X.data+n+1,cmp);
    for(int i=1;i<=n;i++)
    {
        l=X.Out();
        if(X.len==0)
        {
            cout<<l.begin<<" "<<l.end;
        }
        else
        {
            ll=X.Out();
            if(l.end>=ll.begin)
            {
                l.end=ll.end;
                X.In(l);
            }
            else
            {
                cout<<"no";
                return 0;
            }
        }
    }
}

问题:
我觉得写的没问题,自己也是有测试过数据的
但是过不了

请不要直接发答案,而是给出修改建议,可以的话请上面程序批注错误

思路复杂了,先确定x,再确定y。
首先stack有点多余了,数组就能读写了,这里stack意义不大,还影响了你的思路。
排序的方向有问题,不应该从大到小,而是从小到大,方便你找出最小的x,剩下的就是确定y了。
写了个例子,希望能帮助你理解。

#include <algorithm>
#include <iostream>

using namespace std;

//区间定义
struct RNAGE {
    int x;
    int y;
};

bool mycmp(const RNAGE &a, const RNAGE &b) {
    if (a.x != b.x) {
        return a.x < b.x;
    }
    else {
        return a.y < b.y;
    }
}

int main() {
    /*
    input
    5
    5 6
    1 5
    10 10
    6 9
    8 10
    output
    1 10
    */


    //所有区间
    const int MAXN = 5e4 + 4;
    RNAGE data[MAXN];

    //输入区间数量
    int n;
    cin >> n;

    //输入所有区间
    int i;
    for (i = 0; i < n; i++) {
        cin >> data[i].x >> data[i].y;
    }

    //排序,排序之后最小的x就能确定了,是第一个区间的x。
    sort(data, data + n, mycmp);

    //排序之后
    /*
    1 5
    5 6
    6 9
    8 10
    10 10
    */

    //遍历
    RNAGE curr = data[0]; //假设我们要求的区间就是第一个区间,此时是[1,5]
    for (i = 1; i < n; i++) {
        if (data[i].x > curr.y) {//将我们要求区间的y与当前遍历区间的x相比,若小于则说明没有交集
            cout << "no" << endl;
            return 0;
        }
        else { //否则,我们保存比当前区间大的y.这样就找到了最大的y
            curr.y = max(curr.y, data[i].y);
        }
    }
//第一次循环:i=1,data[i]是5 6,curr.y=data[0].y=5, 5>5不成立,进入else,将curr.y更新成6
//第二次循环:i=2,data[i]是6 9,curr.y=data[1].y=6, 6>6不成立,进入else,将curr.y更新成9
//第二次循环:i=3,data[i]是8 10,curr.y=data[2].y=10, 8>9不成立,进入else,将curr.y更新成10
    cout << curr.x << " " << curr.y << endl;

    return 0;
}

【以下回答由 GPT 生成】

首先,通过阅读你提供的代码,我发现有一些潜在的问题。下面是代码的修改建议和错误指正:

  1. struct S中,beginend是C++中的关键字,所以最好避免将这些作为变量名称。将它们改为startfinish
struct S
{
    int start, finish;
} l, ll;
  1. struct stack中,stack是C++标准库中的类名,应该避免使用它作为自定义类的名称。将其改为Stack
struct Stack
{
    S data[10001];
    int len;

    // ...
};
Stack X;
  1. 在主函数中,你没有给len初始化为0,所以使用它会导致不可预期的结果。在定义struct stack的时候,将len初始化为0。
struct Stack
{
    S data[10001];
    int len = 0;

    // ...
};
Stack X;
  1. In()函数中,你没有检查栈是否已满。可以加入一个条件判断,当栈已满时,提示错误信息并退出程序。
void In(S x)
{
    if (len + 1 > 10001)
    {
        cout << "Stack is full!" << endl;
        exit(1);
    }
    len++;
    data[len] = x;
}
  1. Out()函数中,你没有检查栈是否已空。可以加入一个条件判断,当栈已空时,提示错误信息并退出程序。
S Out()
{
    if (len == 0)
    {
        cout << "Stack is empty!" << endl;
        exit(1);
    }
    len--;
    return data[len + 1];
}

通过以上修改,代码中已经解决了一些潜在的问题。然而,还有一些其他可能导致错误的地方需要进一步探究。

首先,你使用了自定义的栈来存储区间数据。但是这样的实现可能会导致顺序问题。在排序后,你可能无法正确地合并区间。推荐使用标准库中的std::stack来实现栈。

其次,根据题目要求和预期输出,可能还存在一些逻辑错误。建议仔细阅读题目要求,并根据要求设计正确的算法。

最后,你没有给出具体的测试数据和预期输出结果,所以我无法提供具体的修改建议。请提供题目的要求、测试数据和预期输出结果。这样我可以更好地帮助你找到问题所在并提供解决方案。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^