【问题描述】在一条数轴上,有 N 条线段,第 i 条线段的左端点是 s[i],右端点是 e[i]。如果线段有重叠(即使是端点重叠也算是重叠),则输出“impossible”, 如果没有重叠则输出“possible”。
【输入格式】
多组测试数据。
第一行,一个整数 G,表示有 G 组测试数据。1 <= G <= 10。每组测试数据格式如下:
第一行,一个整数 N。 1 <= N <= 10。
接下来有 N 行,每行两个整数:s[i],e[i]。 0<=s[i],e[i]<=1000000。
【输出格式】
共 G 行,每行一个字符串,不含双引号。
【输入样例】
5
3
10 47
100 235
236 347
3
100 235
236 347
10 47
2
10 20
20 30
3
10 20
400000 600000
500000 700000
4
1 1000000
40 41
50 51
60 61
【输出样例】
possible
possible
impossible
impossible
impossible
解题思路:首先思考,两段线段之间的情况,只有重合和相离两种情况
第一种情况:两线段重合(注相邻也算重合),如:
第一条:10 20
第二条:20 30
这样算两线段重合
第二种情况:两线段相离,如:
第一条:10 20
第二条:21 30
这样算两线段相离
因此,直接定义结构体,结构体里面有开始和结束两个变量,以先按结束位置排序,如果结束位置相同的话,则按起始位置排序。附代码如下:
#include <bits/stdc++.h>
using namespace std;
struct Node{
int st,end;
}a[1000005];
bool cmp(Node a,Node b)
{
if(a.end==b.end)//结束位置相同的话,按起始位置排序
return a.st<b.st;
return a.end<b.end;//结束位置不同的,按结束位置排序
}
int G,n;
bool sign;
int main(){
cin>>G;
for(int i=0;i<G;i++)
{
sign=false;//标记是否出现覆盖
cin>>n;
for(int j=0;j<n;j++)
cin>>a[j].st>>a[j].end;
sort(a,a+n,cmp);
for(int j=0;j<n-1;j++)
if(a[j].end>=a[j+1].st)
{
sign=true;
break;
}
if(sign)
cout<<"impossible"<<endl;
else
cout<<"possible"<<endl;
}
return 0;
}