最大程度延长整数间隔


14

假设您得到了一组不相交的整数间隔[a1,b1],[a2,b2],[a3,b3],...,[aN,bN]。(其中[a,b]是一组大于或等于a且小于或等于的整数b。)

索引处的间隔X覆盖bX - aX + 1值。我们叫这个号码cX

鉴于每个间隔可以是...

  • 保持不变(保持为[aX,bX]),
  • +通过cX(成为[aX,bX + cX])向数字线的右侧扩展,
  • -通过cX(成为[aX - cX,bX])向行的左侧扩展,

给定所有更新间隔的并集仍然可以不相交,那么最多可以包含多少个值?

编写一个函数或程序,该函数或程序采用字符串形式[a1,b1],[a2,b2],[a3,b3],...,[aN,bN]并计算该最大值。如果编写函数,则返回值。如果编写完整的程序,请使用stdin作为输入并将值打印到stdout(或使用最接近的替代方法)。

您可以假设所有值都在正常的有符号32位整数范围内,aX并且小于或等于bX所有索引X。间隔可以是任何顺序,不一定总是增加。它们必须以上述格式作为字符串给出。该字符串可能为空,在这种情况下,答案将为0。

以字节为单位的最短提交获胜。

如果输入为[-3,0],[1,2],[4,9]输出,则为22。中间间隔没有空间可以扩展,因此必须保持不变。左右间隔都可以分别扩展到[-7,0][4,15]。的联合[-7,0][1,2][4,15]包含了除3.这是22个值的所有值从-7到15。


3
我们是否可以使用语言数组的本机字符串表示形式进行输入,或者是否必须正是这种格式?
马丁·恩德

@MartinBüttner否。您需要使用此确切格式。(我知道那是一把双刃剑,但那就是它的前进方式。)
卡尔文的爱好2015年

您可以在两侧扩展给定间隔吗?例如,可以[5,6]成为[3,8](答案为6),或者可以为正[5,8][3,6](答案为4)?
MtnViewMark 2015年

@MtnViewMark号。它们只能从一侧延伸(或根本不能延伸)
卡尔文的爱好

Answers:


4

Haskell,145个字节

import Data.List
x=maximum.map length.filter(nub>>=(==)).map concat.sequence.map(\[a,b]->[[2*a-b-1..b],[a..b],[a..2*b-a+1]]).read.('[':).(++"]")

样品运行:

λ: x ""
0

λ: x "[5,6]"
4

λ: x "[-3,0],[1,2],[4,9]"
22

1

R,282 278 269 247

这真的很快就可以处理字符串输入了。我怀疑我可以打得更好,但是目前时间已用完。

f=function(s){i=matrix(strtoi(strsplit(gsub('[^0-9,-]','',s),',')[[1]]),nrow=2);l=0;if((a<-length(b<-order(i[1,])))>0){if(a>1)i=i[,b];l=diff(i[,1:a])+1;x=c(t(i));for(n in 1:a)if(n==1|n==a|x[n]-l[n]>x[n+a-1]|x[n+a]+l[n]<x[n+1])l[n]=l[n]*2;};sum(l)}

本质上是

  • 接收字符串并将其转换为2行矩阵
  • 确保顺序正确
  • 计算每列的差异
  • 将第一个和最后一个差异加倍
  • 如果中间差异与上一个或下一个之间的差距足够大,则使中间差异加倍
  • 返回差异之和

编辑:意识到我最初误算了字符,然后重新整理了一些东西以剃光一些。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.