ขยายช่วงเต็มจำนวนสูงสุด


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]มีค่าทั้งหมดจาก -7 ถึง 15 ยกเว้น 3 นั่นคือ 22 ค่า


3
เราสามารถใช้การแทนค่าสตริงพื้นเมืองของอาเรย์ของภาษาของเราสำหรับการป้อนข้อมูลหรือมันจะต้องเป็นรูปแบบนี้หรือไม่?
Martin Ender

@ MartinBüttnerไม่คุณจำเป็นต้องใช้รูปแบบที่แน่นอนนี้ (ฉันรู้ว่ามันเป็นดาบสองคม แต่ก็เป็นไปตามนั้น)
Calvin's Hobbies

คุณสามารถขยายช่วงเวลาที่กำหนดทั้งสองด้านได้หรือไม่? ตัวอย่างเช่นสามารถ[5,6]เป็น[3,8](สำหรับคำตอบของ 6) หรือเป็นเพียง[5,8]หรือ[3,6](สำหรับคำตอบของ 4)?
MtnViewMark

@MtnViewMark ไม่สามารถขยายได้จากด้านใดด้านหนึ่งเท่านั้น (หรือไม่เลย)
Calvin's Hobbies

คำตอบ:


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 แถว
  • ตรวจสอบให้แน่ใจว่าอยู่ในลำดับที่ถูกต้อง
  • คำนวณความแตกต่างสำหรับแต่ละคอลัมน์
  • สองเท่าของความแตกต่างแรกและสุดท้าย
  • ความแตกต่างตรงกลางเป็นสองเท่าหากพวกเขามีช่องว่างไปก่อนหน้าหรือถัดไปที่มีขนาดใหญ่พอ
  • ส่งคืนผลรวมของความแตกต่าง

แก้ไข: ฉันรู้ว่าฉันทำผิดตัวอักษรเดิมแล้วจัดเรียงบางสิ่งเพื่อโกนหนวด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.