/*Gene Assembly http://acm.zju.edu.cn/show_problem.php?pid=1076
2008.6.4 16:49:33 Accepted 1076 C++ 00:00.01 856K 天将降大任于我
题目意思还不是很明白
不过数据意思我知道,就是先从小到大排序后,当i<j时,a[i].y<a[j].x,找出所有符合这种条件的数,
选择符合这种条件的个数最多的输出。
即假设每一对数是一个区间,则按从小到大,找出不互相覆盖(即没有公共部分)的区间来,
将其中符合这种条件的区间个数最多的那个输出
*/
#include<iostream>
using namespace std;
struct node
{
int x,y,index;
}a[1001],temp;
int main()
{
int i,j,sum,k,n,max;
int s[1001],t[1001];
while(scanf("%d",&n)&&n)
{
for(i=0;i<n;i++)
{ scanf("%d%d",&a[i].x,&a[i].y);
a[i].index=i+1;
}
for(i=0;i<n-1;i++) //选择排序,从小到大
{
k=i;
for(j=i+1;j<n;j++)
if(a[j].x<=a[k].x) k=j;
if(k!=i)
{
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
}
max=0;
for(i=0;i<n;i++) //找出没有覆盖的区间
{
k=0;sum=1;
s[k++]=i;
temp=a[i];
for(j=i+1;j<n;j++)
{
if(temp.y<=a[j].x)
{
s[k++]=j;
temp=a[j];
sum++;
}
}
if(max<sum)
{
max=sum;
for(int r=0;r<max;r++) t[r]=s[r];
}
}
for(i=0;i<max-1;i++)
printf("%d ",a[t[i]].index);
printf("%d\n",a[t[max-1]].index);
}
return 0;
}
心难泰,世风坏,旧时正气今何在?正义寡,人情薄,闻道虽多,茅塞不开。怪!怪!怪!
空等待,几多载,冲出重围人心快!暴雨打,狂风袭,任他折磨,此志难改。耐!耐!耐!