BitComet 旗下网站

转到日志 acm of zju

zju1076

楼主 发表于:2008-06-04 17:08:53 [回复]

/*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;
}

心难泰,世风坏,旧时正气今何在?正义寡,人情薄,闻道虽多,茅塞不开。怪!怪!怪! 空等待,几多载,冲出重围人心快!暴雨打,狂风袭,任他折磨,此志难改。耐!耐!耐!

登录后发贴