Tamsayı aralıklarını maksimum uzatma


14

Bir tamsayı kesişmeyen aralık kümesi verildiğini varsayalım [a1,b1],[a2,b2],[a3,b3],...,[aN,bN]. (Burada [a,b]daha büyük ya da eşit tamsayılar grubu olduğu ave daha az ya da eşit b).

Dizindeki aralık değerleri Xkapsar bX - aX + 1. Bu numarayı arayacağız cX.

Her aralığın ya ...

  • değişmedi (olarak kalır [aX,bX]),
  • doğru ( +çizginin ) çizgisinin sayının yanına doğru uzatılmış ,cX[aX,bX + cX]
  • veya (haline gelerek ) -satırın kenarına doğru sola doğru uzatılmış ,cX[aX - cX,bX]

hala kesişmeyen olmaları koşuluyla, güncellenen tüm aralıkların birliği tarafından kapsanabilecek maksimum değer sayısı nedir?

Formun bir dizesini alan [a1,b1],[a2,b2],[a3,b3],...,[aN,bN]ve bu maksimum değeri hesaplayan bir işlev veya program yazın . Bir işlev yazıyorsanız, değeri döndürün. Tam bir program yazıyorsanız, giriş için stdin kullanın ve değeri stdout'a yazdırın (veya en yakın alternatifleri kullanın).

Tüm değerlerin normal imzalı 32 bit tam sayı sınırları içinde olduğunu ve bunun tüm dizinler için aXeşit veya daha düşük olduğunu varsayabilirsiniz . Aralıklar herhangi bir sırada olabilir, her zaman artmayabilir. Yukarıdaki formatta bir dize olarak verilmelidir. Dize boş olabilir, bu durumda cevap 0 olur.bXX

Bayt cinsinden en kısa gönderim kazanır.

Misal

Eğer giriş [-3,0],[1,2],[4,9]22 olsaydı, orta aralığın her iki yönde de genişlemesi için bir yeri olmaz, bu yüzden değişmeden kalmalıdır. Sol ve sağ aralıklar sırasıyla [-7,0]ve [4,15]sırasıyla genişletilebilir . Birliği [-7,0]ve [1,2]ve [4,15]22 değerlerini bulunuyor 3. haricinde gelen -7 15'e tüm değerleri içerir.


3
Giriş için dilimizin dizilerinin yerel dize temsilini kullanabilir miyiz, yoksa tam olarak bu biçim mi olmalı?
Martin Ender

@ MartinBüttner Hayır. Bu biçimi tam olarak kullanmanız gerekir. (Bu tür bir çift uçlu kılıç biliyorum ama bu böyle gidiyor.)
Calvin'in Hobileri

Her iki tarafta belirli bir aralığı genişletebilir misiniz? Örneğin, olabilir [5,6]haline [3,8](6 cevabını), ya da sadece olabilir [5,8]veya [3,6](4 cevap)?
MtnViewMark

@MtnViewMark No. Yalnızca bir taraftan genişletilebilirler (veya hiç genişletilemezler)
Calvin'in Hobileri

Yanıtlar:


4

Haskell, 145 bayt

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.('[':).(++"]")

Örnek çalışmalar:

λ: x ""
0

λ: x "[5,6]"
4

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

1

R, 282 278 269 247

Bu, dize girdisi ile gerçekten hızlı bir şekilde başa çıktı. Ben daha iyi golf olabilir sanırım, ama şu anda zaman tükendi.

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)}

Esasen fikir

  • Dizeyi alın ve 2 satırlık bir matrise dönüştürün
  • Doğru sırada olduğundan emin olun
  • Her sütun için farklılıkları bulun
  • İlk ve son farkları iki katına çıkarın
  • Bir önceki veya bir sonrakine yeterince büyük bir boşluk varsa orta farkları iki katına çıkarın
  • Farklılıkların toplamını döndürün

Düzenleme: Ben aslında karakterleri yanlış sayılır, sonra birkaç şey tıraş için birkaç şey yeniden düzenledi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.