计算重叠区间大小

hmgujie 2009-05-25 01:21:28
题目描述:请编写程序,找出下面 “ 输入数据及格式 ” 中所描述的输入数据文件中最大重叠区间的大小。

对一个正整数 n ,如果 n 在数据文件中某行的两个正整数(假设为 A 和 B )之间,即 A<=n<=B 或 A>=n>=B ,则 n 属于该行;如果 n 同时属于行 i 和 j ,则 i 和 j 有重叠区间;重叠区间的大小是同时属于行 i 和 j 的整数个数。
例如,行( 10 20 )和( 12 25 )的重叠区间为 [12 20] ,其大小为 9 ,行 (20 10) 和( 20 30 )的重叠区间大小为 1 。

输入数据:程序读入已被命名为 input.txt 的输入数据文本文件,该文件的行数在 1 到 1,000,000 之间,每行有用一个空格分隔的 2 个正整数,这 2 个正整数的大小次序随机,每个数都在 1 和 2^32-1 之间。(为便于调试,您可下载测试 input.txt 文件,实际运行时我们会使用不同内容的输入文件。)

输出数据:在标准输出上打印出输入数据文件中最大重叠区间的大小,如果所有行都没有重叠区间,则输出 0 。

评分标准:程序输出结果必须正确,内存使用必须不超过 256MB ,程序的执行时间越快越好。


谁能给点思路 我想不出来
...全文
387 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿色夹克衫 2009-05-26
  • 打赏
  • 举报
回复
基本上就是这个意思,写出程序就更直观了!

唯一有些问题的地方就是咱不是大牛,比起mathe,大王他们还差远了。况且他们都不承认自己是大牛呢。

[Quote=引用 4 楼 lzy18lzy 的回复:]
【培训试题】线段覆盖

Time Limit:10000MS Memory Limit:65536K
Total Submit:73 Accepted:18
Case Time Limit:1000MS

Description

  给出数轴上N条线段,第i条线段用两个数表示Ai , Bi(Ai < Bi),表示从Ai到Bi的一条线段。现在请求出它们覆盖数轴上的多长距离。(Ai、Bi的绝对值可能达到10^9)


Input

 第一行:N
 以后N行,每行两个数:Ai Bi


Output

 一个数,表示覆盖长度

S…
[/Quote]
无天 2009-05-25
  • 打赏
  • 举报
回复
百度之星的试题啊。顶!
lzy18lzy 2009-05-25
  • 打赏
  • 举报
回复
【培训试题】线段覆盖

Time Limit:10000MS Memory Limit:65536K
Total Submit:73 Accepted:18
Case Time Limit:1000MS

Description

  给出数轴上N条线段,第i条线段用两个数表示Ai , Bi(Ai < Bi),表示从Ai到Bi的一条线段。现在请求出它们覆盖数轴上的多长距离。(Ai、Bi的绝对值可能达到10^9)



Input

 第一行:N
 以后N行,每行两个数:Ai Bi


Output

 一个数,表示覆盖长度

Sample Input


 3
 2 8
 -1 1
 5 10


Sample Output


  10

Source

xinyue


//Memory:284K Time:261MS
//Language:G++ Result:Accepted

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define max 1000000

struct node{ int t1,t2; } save[max];

int cmp(const void *a,const void *b)
{
return ((node*)a)->t1 - ((node*)b)->t1;
}

int main()
{
int from,to;
int m,n,t,count;

while(scanf("%d",&m)!=EOF)
{
for(n=0;n<m;n++) scanf("%d%d",&save[n].t1,&save[n].t2);
qsort(save,m,sizeof(node),cmp);
t = count = 0;
from = save[0].t1;
to = save[0].t2;
save[m].t2 = save[m].t1 = 1000000000;
for(n=0;n<=m;n++)
{
if(save[n].t1 <= to)
{
if(to < save[n].t2) to = save[n].t2;
}
else
{
count = count + (to - from);
from = save[n].t1;
to = save[n].t2;
}
}
printf("%d\n",count);
}
return 0;
}




正如一楼大牛所说!!!!
绿色夹克衫 2009-05-25
  • 打赏
  • 举报
回复
(20, 10)先转化为(10,20),上面提到了左端点是较小的数,右端点是较大的数,排序后为(10,20) (20,30)

20 - 20 = 0,不过最后输出的时候需要+1,因为包含整数的个数为区间的长度+1,(0,5)区间长度为5,重叠区间却是6,

当区间的长度为负数的时候,表示没有重叠部分,输出0。

[Quote=引用 2 楼 kenny_qiao 的回复:]
(20, 10)和(20, 30)的重叠区间为1,而按1楼的做法,这个值是10。
[/Quote]
kenny_qiao 2009-05-25
  • 打赏
  • 举报
回复
(20, 10)和(20, 30)的重叠区间为1,而按1楼的做法,这个值是10。
绿色夹克衫 2009-05-25
  • 打赏
  • 举报
回复
先用n*log(n), 按照区间的左端点(较小的那个数)排个序,然后用O(n)遍历一遍就行了!

遍历的过程只记录右端点(较大的那个数)的最大值,重叠区间=最大值-当前左端点值,记录产生过的最大重叠区间就行了!

也可以用线段树来做,不过是一样的!

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧