Tối đa kéo dài khoảng số nguyên


14

Giả sử bạn được cung cấp một tập hợp các số nguyên không giao nhau[a1,b1],[a2,b2],[a3,b3],...,[aN,bN] . (Trường hợp [a,b]tập hợp các số nguyên lớn hơn hoặc bằng avà nhỏ hơn hoặc bằng b.)

Khoảng tại chỉ số Xbao gồm bX - aX + 1các giá trị. Chúng tôi sẽ gọi số này cX.

Cho rằng mỗi khoảng có thể là ...

  • không thay đổi (vẫn như [aX,bX]),
  • mở rộng sang bên phải về +phía số của dòng bằng cách cX(trở thành [aX,bX + cX]),
  • hoặc mở rộng sang bên trái về -phía số của dòng bằng cách cX(trở thành [aX - cX,bX]),

số lượng giá trị tối đa có thể được bao phủ bởi sự kết hợp của tất cả các khoảng thời gian được cập nhật là gì, cho rằng chúng vẫn không giao nhau?

Viết hàm hoặc chương trình lấy một chuỗi biểu mẫu [a1,b1],[a2,b2],[a3,b3],...,[aN,bN]và tính toán mức tối đa này. Nếu viết một hàm, trả về giá trị. Nếu viết một chương trình đầy đủ, sử dụng stdin cho đầu vào và in giá trị ra thiết bị xuất chuẩn (hoặc sử dụng các lựa chọn thay thế gần nhất).

Bạn có thể giả sử tất cả các giá trị đều nằm trong giới hạn số nguyên 32 bit được ký bình thường và aXnhỏ hơn hoặc bằng bXvới tất cả các chỉ số X. Các khoảng có thể theo thứ tự bất kỳ, chúng không nhất thiết phải luôn luôn tăng. Chúng phải được đưa ra dưới dạng một chuỗi trong định dạng trên. Chuỗi có thể trống, trong trường hợp đó, câu trả lời sẽ là 0.

Đệ trình ngắn nhất tính bằng byte thắng.

Thí dụ

Nếu đầu vào là [-3,0],[1,2],[4,9]đầu ra sẽ là 22. Khoảng giữa không có chỗ để mở rộng, do đó, nó phải không thay đổi. Khoảng thời gian bên trái và bên phải có thể được mở rộng đến [-7,0][4,15]tương ứng. Liên kết [-7,0][1,2][4,15]chứa tất cả các giá trị từ -7 đến 15, ngoại trừ 3. Đó là 22 giá trị.


3
Chúng ta có thể sử dụng biểu diễn chuỗi gốc của mảng ngôn ngữ của mình cho đầu vào không, hoặc nó có phải chính xác định dạng này không?
Martin Ender

@ MartinBüttner số Bạn cần sử dụng định dạng chính xác này. (Tôi biết đó là một con dao hai lưỡi nhưng đó là cách nó hoạt động.)
Sở thích của Calvin

Bạn có thể mở rộng một khoảng nhất định ở cả hai bên? Ví dụ: có thể [5,6]trở thành [3,8](cho câu trả lời là 6), hoặc có thể chỉ [5,8]hoặc [3,6](cho câu trả lời là 4)?
MtnViewMark

@MtnViewMark Không. Chúng chỉ có thể được mở rộng từ một phía (hoặc hoàn toàn không)
Sở thích của Calvin

Câu trả lời:


4

Haskell, 145 byte

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

Chạy mẫu:

λ: x ""
0

λ: x "[5,6]"
4

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

1

R, 282 278 269 247

Điều này đã thực sự lớn xử lý nhanh chóng với đầu vào chuỗi. Tôi nghi ngờ tôi có thể chơi golf này tốt hơn, nhưng đã hết thời gian.

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

Thực chất ý tưởng là

  • Lấy chuỗi và biến nó thành ma trận 2 hàng
  • Hãy chắc chắn rằng nó theo đúng thứ tự
  • Tìm ra sự khác biệt cho mỗi cột
  • Nhân đôi sự khác biệt đầu tiên và cuối cùng
  • Nhân đôi sự khác biệt ở giữa nếu chúng có khoảng cách so với trước hoặc sau đủ lớn
  • Trả lại tổng của sự khác biệt

Chỉnh sửa: nhận ra tôi đã nhầm lẫn các ký tự ban đầu, sau đó sắp xếp lại một vài thứ để cạo một vài thứ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.