问题标题: 酷町堂:4217

0
0
已解决
杨子逸
杨子逸
新手天翼
新手天翼

哪里错了???

#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstdio>
using namespace std;
struct node{
    int x,y;
}a[1000],b[1000];
int k,n;
bool e(node a,node b)
{
    if(a.x!=b.x) return a.x<b.x;
}
void dfs(int s)
{
    if(s==0)
    {
        b[k].x=a[s].x;
        dfs(s+1);
    }
    else if(s==n)
    {
        for(int i=0;i<=k;i++)
        {
            cout<<b[i].x<<' '<<b[i].y<<endl;
        }
    }
    else
    {
        if(s==n-1)
        {
            if(a[s-1].y<=a[s].x)
            {
                b[k].y=a[s-1].y;
                k++;
                b[k].x=a[s].x;
            }
            b[k].y=a[s].y;
        }
        else if(a[s-1].y<=a[s].x)
        {
            b[k].y=a[s-1].y;
            k++;
            b[k].x=a[s].x;
        }
        dfs(s+1);
    }
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i].x>>a[i].y;
    }
    sort(a,a+n,e);
    dfs(0);
    return 0;
}
//可修改或发部分代码

@沈吴敏


0
已采纳
叶子煊
叶子煊
中级光能
中级光能

我先和你说思路吧(如果不懂再问我)

先定义一个结构体,其中包含起始值(x)和结束值(y)

在对结构体进行排序(起始值从小到大排序即可,结束值排不排序都可以)

然后定义两个常量:start和end(用来记录合并后区间的起始值和结束值)

最后用一个循环进行特判实现合并(不懂再问我)

最后输出即可

~~~~~~~~~~~~~~~~~~~~~~

望采纳~

叶子煊在2019-07-07 09:40:35追加了内容

核心这是循环的内容:

        if(a[i].s<=end)
		{
			if(a[i].e>end)
				end=a[i].e;
		}
		else 
		{
			cout<<start<<" "<<end<<endl;
			start=a[i].s;
			end=a[i].e;
		}

这里的i从2开始

因为前面的start和end都是用a[1]定义的

之后如果a[i]大于end值并且和上一个区间有重复的则更新end值

否则输出(因为之前从小到大排序了所以若没有重合则后面的区间都没有重合)

记住更新end和start值

最后在循环外面再输出(因为最后在循环里面更新的end和start没有输出)

0
吕牧原
吕牧原
高级守护
高级守护

我先和你说思路吧(如果不懂再问我)

先定义一个结构体,其中包含起始值(x)和结束值(y)

在对结构体进行排序(起始值从小到大排序即可,结束值排不排序都可以)

然后定义两个常量:start和end(用来记录合并后区间的起始值和结束值)

0
陶旭杰
陶旭杰
中级光能
中级光能

你想的太复杂了,这道题不是搜索,是贪心。

用结构体,成员分别是:z(左端点)y(右端点)b(标记,该区间是否被合并)。

首先按左端点从小到大排序。

然后使用for循环从2到n循环{

如果a[i].z<=a[i-1].y&&(a[i].y>=a[i-1].y||a[i-1].y>=a[i].y)//自己理解

那么把当前元素a[i]的左端点更新为上一个元素a[i-1]的左端点,

把a[i]的右端点更新为max(a[i]的右端点,a[i-1]的右端点)

将a[i-1].b标记为1(已合并)//别忘了在输入循环里把a[i].b都赋值1

}

循环输出未合并的区间

核心循环代码:

for(int i=2;i<=n;i++){
        if(a[i].z<=a[i-1].y&&(a[i].y>=a[i-1].y||a[i-1].y>=a[i].y)){
            a[i].z=a[i-1].z;
            a[i].y=max(a[i].y,a[i-1].y);
            a[i-1].b=0;
        }
    }

祝你AC愉快!!!

陶旭杰在2019-07-07 10:24:30追加了内容

说错了,在输入循环里a[i].b应该都赋值为1。

在核心循环里a[i].b是赋值为0。

 

0
0
我要回答