给定一条线上的N (0 < N < 100)条线段,每一条线段给定它的端点Ai、 Bi (Ai <> Bi, i=1..N).端点的范围在整数区间(-999,999)内。一些线段可能会交叉。请写程序从给定的线段中删除最少的线段,使到剩下的线段中内部没有交点。
input:
第一行给出线段数N,以下N行,包含两个整数 (Ai and Bi),用空格隔开。
output:
第一行输出整数P,为剩下的线段数。接下来的P行为剩下的线段的左端点和右端点,用一个空格隔开,而且必须按照左端点的升序排列。假如有多种方案,输出任意一种即可。
input:
3
6 3
1 3
2 5
output:
2
1 3
3 6【参考程序】:
#include<iostream>//原型是最长不降子序列
using namespace std;
struct node1
{
int s,pre;
} opt[101];
struct node2
{
int x,y;
} a[101];
int n;
int cmp(const void *s,const void *t)
{
node2 i=*(node2 *)s,j=*(node2 *)t;
if (i.x!=j.x) return i.x-j.x;
else return i.y-j.y;
}
void printf_path(int p)
{
if (!p) return ;
printf_path(opt[p].pre);
printf("%d %d\n",a[p].x,a[p].y);
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
if (a[i].x>a[i].y)
{
int t=a[i].x;a[i].x=a[i].y;a[i].y=t;
}
}
qsort(a+1,n,sizeof(node2),cmp);
memset(opt,0,sizeof(opt));
for (int i=2;i<=n;i++)
for (int j=1;j<=i-1;j++)
if (a[j].y<=a[i].x)
if (opt[j].s+1>opt[i].s)
{
opt[i].s=opt[j].s+1;
opt[i].pre=j;
}
int ans=-1,k;
for (int i=1;i<=n;i++)
if (opt[i].s>ans)
{
ans=opt[i].s;
k=i;
}
printf("%d\n",ans+1);
printf_path(k);
return 0;
}