新手天翼
哪里错了???
#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;
}
//可修改或发部分代码
@沈吴敏
中级光能
我先和你说思路吧(如果不懂再问我)
先定义一个结构体,其中包含起始值(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没有输出)
高级守护
我先和你说思路吧(如果不懂再问我)
先定义一个结构体,其中包含起始值(x)和结束值(y)
在对结构体进行排序(起始值从小到大排序即可,结束值排不排序都可以)
然后定义两个常量:start和end(用来记录合并后区间的起始值和结束值)
中级光能
你想的太复杂了,这道题不是搜索,是贪心。
用结构体,成员分别是: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。