计算重叠区间大小

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 ,程序的执行时间越快越好。


谁能给点思路 我想不出来
...全文
353 6 打赏 收藏 转发到动态 举报
写回复
用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)遍历一遍就行了!

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

也可以用线段树来做,不过是一样的!
掌握分布式mapreduce与raft算法与分布式数据库MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念Map(映射)和Reduce(归约),是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。MapReduce是面向大数据并行处理的计算模型、框架和平台,它隐含了以下三层含义:1)MapReduce是一个基于集群的高性能并行计算平台(Cluster Infrastructure)。它允许用市场上普通的商用服务器构成一个包含数十、数百至数千个节点的分布和并行计算集群。2)MapReduce是一个并行计算与运行软件框架(Software Framework)。它提供了一个庞大但设计精良的并行计算软件框架,能自动完成计算任务的并行化处理,自动划分计算数据和计算任务,在集群节点上自动分配和执行任务以及收集计算结果,将数据分布存储、数据通信、容错处理等并行计算涉及到的很多系统底层的复杂细节交由系统负责处理,大大减少了软件开发人员的负担。3)MapReduce是一个并行程序设计模型与方法(Programming Model & Methodology)。它借助于函数式程序设计语言Lisp的设计思想,提供了一种简便的并行程序设计方法,用Map和Reduce两个函数编程实现基本的并行计算任务,提供了抽象的操作和并行编程接口,以简单方便地完成大规模数据的编程和计算处理Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法结构和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易构建实际的系统。为了提升可理解性,Raft 将一致性算法分解成了几个关键模块,例如leader人选举、日志复制和安全性。同时它通过实施一个更强的一致性来减少需要考虑的状态的数量。从一个用户研究的结果可以证明,对于学生而言,Raft 算法比 Paxos 算法更加容易学习。Raft 算法还包括一个新的机制来允许集群成员的动态改变,它利用重叠的大多数来保证安全性。 一致性算法允许一组机器像一个整体一样工作,即使其中一些机器出现故障也能够继续工作下去。正因为如此,一致性算法在构建可信赖的大规模软件系统中扮演着重要的角色。在过去的 10 年里,Paxos 算法统治着一致性算法这一领域:绝大多数的实现都是基于 Paxos 或者受其影响。同时 Paxos 也成为了教学领域里讲解一致性问题时的示例。 但是不幸的是,尽管有很多工作都在尝试降低它的复杂性,但是 Paxos 算法依然十分难以理解。并且,Paxos 自身的算法结构需要进行大幅的修改才能够应用到实际的系统中。这些都导致了工业界和学术界都对 Paxos 算法感到十分头疼。 和 Paxos 算法进行过努力之后,我们开始寻找一种新的一致性算法,可以为构建实际的系统和教学提供更好的基础。我们的做法是不寻常的,我们的首要目标是可理解性:我们是否可以在实际系统中定义一个一致性算法,并且能够比 Paxos 算法以一种更加容易的方式来学习。此外,我们希望该算法方便系统构建者的直觉的发展。不仅一个算法能够工作很重要,而且能够显而易见的知道为什么能工作也很重要。 Raft 一致性算法就是这些工作的结果。在设计 Raft 算法的时候,我们使用一些特别的技巧来提升它的可理解性,包括算法分解(Raft 主要被分成了leader人选举,日志复制和安全三个模块)和减少状态机的状态(相对于 Paxos,Raft 减少了非确定性和服务器互相处于非一致性的方式)。一份针对两所大学 43 个学生的研究表明 Raft 明显比 Paxos 算法更加容易理解。在这些学生同时学习了这两种算法之后,和 Paxos 比起来,其中 33 个学生能够回答有关于 Raft 的问题。 Raft 算法在许多方面和现有的一致性算法都很相似(主要是 Oki 和 Liskov 的 Viewstamped Replication),但是它也有一些独特的特性: 强leader:和其他一致性算法相比,Raft 使用一种更强的leader能力形式。比如,日志条目只从leader发送给其他的服务器。这种方式简化了对复制日志的管理并且使得 Raft 算法更加易于理解。leader选举:Raft 算法使用一个随机计时器来选举leader。这种方式只是在任何一致性算法都必须实现的心跳机制上增加了一点机制。在解决冲突的时候会更加简单快捷。成员关系调整:Raft 使用一种共同一致的方法来处理集群成员变换的问

33,010

社区成员

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

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