【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 108444
  • 排名 - 229

最新评论

阅读排行榜

评论排行榜

给定一条线上的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;
}
posted on 2009-06-01 19:13 开拓者 阅读(123) 评论(0)  编辑 收藏 引用 所属分类: URAL 题解

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理