Đây là một thách thức hoạt động ít nhất trong đó mục tiêu là sắp xếp một vectơ theo thứ tự tăng dần bằng cách sử dụng các đảo ngược ít nhất. Thuật toán của bạn chỉ có thể sắp xếp vectơ bằng cách sử dụng "đảo ngược vectơ phụ" 1 , nhưng nó có thể sử dụng các phép toán khác cho các phép toán số học, các vòng lặp, kiểm tra xem nó có được sắp xếp không, v.v. Số lượng vectơ phụ của thuật toán của bạn thực hiện là điểm của nó.
1 "Đảo ngược vector phụ":
- Chọn một phạm vi số trong vectơ và đảo ngược các phần tử trong phạm vi đó.
Để đưa ra một ví dụ đơn giản, nếu bạn bắt đầu với vectơ {4,3,2,1}
, thì bạn có thể sắp xếp nó theo nhiều cách khác nhau:
- Đảo ngược toàn bộ vector. Đây rõ ràng là cách tiếp cận ngắn nhất vì nó chỉ yêu cầu một lần đảo ngược:
{4,3,2,1} -> {1,2,3,4}
- Bạn có thể thực hiện một phiên bản sắp xếp bong bóng, yêu cầu 6 lần đảo ngược:
{4,3,2,1} -> {3,4,2,1} -> {3,2,4,1} -> {2,3,4,1} -> {2,3,1,4} -> {2,1,3,4} -> {1,2,3,4}
- Bạn có thể bắt đầu với 3 yếu tố đầu tiên, sau đó là ba yếu tố cuối cùng và cuối cùng là hai yếu tố đầu tiên và hai yếu tố cuối cùng, yêu cầu 4 lần hoán đổi:
{4,3,2,1} -> {2,3,4,1} -> {2,1,4,3} -> {1,2,4,3} -> {1,2,3,4}
- ... và cứ thế. Có vô số tùy chọn có sẵn (bạn có thể lặp lại bất kỳ thao tác nào nếu muốn).
Quy tắc và yêu cầu:
Mã của bạn phải hoàn thành trong vòng chưa đầy một phút cho danh sách có 100 số. Bạn có thể thời gian này, nhưng xin vui lòng chơi công bằng 2 .
Bạn phải lưu trữ các chỉ số bắt đầu và kết thúc của tất cả các giao dịch hoán đổi bạn thực hiện, để giải pháp có thể được xác minh. (Tôi sẽ giải thích điều này có nghĩa là gì bên dưới).
Mã phải có tính xác định.
Bạn có thể lấy đầu vào trên bất kỳ định dạng nào bạn muốn: Vectơ số, danh sách liên kết, mảng có độ dài ... bất cứ điều gì bạn thích.
Bạn có thể làm bất cứ điều gì bạn thích trên một bản sao của vectơ. Điều đó bao gồm cố gắng đảo ngược khác nhau và kiểm tra đó là hiệu quả nhất. Brute-buộc là hoàn toàn tốt, nhưng tuân theo giới hạn thời gian.
Điểm số là tổng số lần lật cho 5 vectơ kiểm tra. Tie-breaker sẽ đóng dấu ngày.
Thí dụ:
4 1 23 21 49 2 7 9 2 | Vectơ / danh sách ban đầu 4 1 2 9 7 2 49 21 23 | (2, 8) (lật các yếu tố giữa các chỉ số 2 và 8) 4 1 2 2 7 9 49 21 23 | (3, 5) 4 1 2 2 7 9 23 21 49 | (6, 8) 4 1 2 2 7 9 21 23 49 | (6, 7) 2 2 1 4 7 9 21 23 49 | (0, 3) 1 2 2 4 7 9 21 23 49 | (0, 2)
Điểm sẽ là 6, vì bạn đã thực hiện 6 lần đảo chiều. Bạn phải lưu trữ (không in) các chỉ mục được liệt kê ở phía bên phải trên một định dạng phù hợp có thể dễ dàng in / xuất ra cho mục đích xác minh.
Các vectơ kiểm tra:
133, 319, 80, 70, 194, 333, 65, 21, 345, 142, 82, 491, 92, 167, 281, 386, 48, 101, 394, 130, 111, 139, 214, 337, 180, 24, 443, 35, 376, 13, 166, 59, 452, 429, 406, 256, 133, 435, 446, 304, 350, 364, 447, 471, 236, 177, 317, 342, 294, 146, 280, 32, 135, 399, 78, 251, 467, 305, 366, 309, 162, 473, 27, 67, 305, 497, 112, 399, 103, 178, 386, 343, 33, 134, 480, 147, 466, 244, 370, 140, 227, 292, 28, 357, 156, 367, 157, 60, 214, 280, 153, 445, 301, 108, 77, 404, 496, 3, 226, 37
468, 494, 294, 42, 19, 23, 201, 47, 165, 118, 414, 371, 163, 430, 295, 333, 147, 336, 403, 490, 370, 128, 261, 91, 173, 339, 40, 54, 331, 236, 255, 33, 237, 272, 193, 91, 232, 452, 79, 435, 160, 328, 47, 179, 162, 239, 315, 73, 160, 266, 83, 451, 317, 255, 491, 70, 18, 275, 339, 298, 117, 145, 17, 178, 232, 59, 109, 271, 301, 437, 63, 103, 130, 15, 265, 281, 365, 444, 180, 257, 99, 248, 378, 158, 210, 466, 404, 263, 29, 117, 417, 357, 44, 495, 303, 428, 146, 215, 164, 99
132, 167, 361, 145, 36, 56, 343, 330, 14, 412, 345, 263, 306, 462, 101, 453, 364, 389, 432, 32, 200, 76, 268, 291, 35, 13, 448, 188, 11, 235, 184, 439, 175, 159, 360, 46, 193, 440, 334, 128, 346, 192, 263, 466, 175, 407, 340, 393, 231, 472, 122, 254, 451, 485, 257, 67, 200, 135, 132, 421, 205, 398, 251, 286, 292, 488, 480, 56, 284, 484, 157, 264, 459, 6, 289, 311, 116, 138, 92, 21, 307, 172, 352, 199, 55, 38, 427, 214, 233, 404, 330, 105, 223, 495, 334, 169, 168, 444, 268, 248
367, 334, 296, 59, 18, 193, 118, 10, 276, 180, 242, 115, 233, 40, 225, 244, 147, 439, 297, 115, 354, 248, 89, 423, 47, 458, 64, 33, 463, 142, 5, 13, 89, 282, 186, 12, 70, 289, 385, 289, 274, 136, 39, 424, 174, 186, 489, 73, 296, 39, 445, 308, 451, 384, 451, 446, 282, 419, 479, 220, 35, 419, 161, 14, 42, 321, 202, 30, 32, 162, 444, 215, 218, 102, 140, 473, 500, 480, 402, 1, 1, 79, 50, 54, 111, 189, 147, 352, 61, 460, 196, 77, 315, 304, 385, 275, 65, 145, 434, 39
311, 202, 126, 494, 321, 330, 290, 28, 400, 84, 6, 160, 432, 308, 469, 459, 80, 48, 292, 229, 191, 240, 491, 231, 286, 413, 170, 486, 59, 54, 36, 334, 135, 39, 393, 201, 127, 95, 456, 497, 429, 139, 81, 293, 359, 477, 404, 129, 129, 297, 298, 495, 424, 446, 57, 296, 10, 269, 350, 337, 39, 386, 142, 327, 22, 352, 421, 32, 171, 452, 2, 484, 337, 359, 444, 246, 174, 23, 115, 102, 427, 439, 71, 478, 89, 225, 7, 118, 453, 350, 109, 277, 338, 474, 405, 380, 256, 228, 277, 3
Tôi khá chắc chắn rằng việc tìm kiếm một giải pháp tối ưu là NP-hard (vì phân loại bánh kếp thông thường là).
2 Có, những người có máy tính rất nhanh có thể có lợi ích, do giới hạn thời gian là một phút. Sau nhiều cuộc thảo luận, tôi đã nhận ra rằng tốt nhất là nếu mọi người tự chấm điểm riêng, đó không phải là một thử thách mã nhanh nhất.
n-1
flips không? Tôi chỉ có thể chứng minh giới hạn dưới khoảng 50.