Bạn được đưa ra, như một danh sách hoặc vectơ hoặc bất cứ điều gì, một bó 3-tuples hoặc bất cứ điều gì, trong đó hai điều đầu tiên là chuỗi và điều thứ ba là một số. Các chuỗi là thành phố và số là khoảng cách giữa chúng. Thứ tự của các thành phố trong tuple là tùy ý (nghĩa là không có vấn đề nào đến trước và thứ hai) vì nó có cùng khoảng cách mỗi chiều. Ngoài ra, có chính xác một tuple cho mỗi cặp trích dẫn được kết nối. Không phải tất cả các thành phố có thể được kết nối. Ngoài ra, khoảng cách luôn luôn tích cực (không0
). Bạn không cần kiểm tra các điều kiện này, bạn có thể cho rằng đầu vào sẽ được hình thành tốt. Công việc của bạn là trả lại các thành phố theo trình tự tuần hoàn, như vậy, nếu bạn bắt đầu ở bất kỳ thành phố nào và đi vòng quanh trở lại cùng một thành phố, tổng khoảng cách giữa các thành phố sẽ là tối thiểu (chính xác và tất cả trường hợp.) Bạn có thể giả sử một giải pháp tồn tại. Ví dụ: giả sử bạn được cho
[("New York", "Detroit", 2.2), ("New York", "Dillsburg", 3.7), ("Hong Kong", "Dillsburg", 4), ("Hong Kong", "Detroit", 4), ("Dillsburg", "Detroit", 9000.1), ("New York", "Hong Kong", 9000.01)]
Bạn có thể xuất bất kỳ thứ nào sau đây (nhưng bạn chỉ cần xuất một cái):
["Detroit","Hong Kong","Dillsburg","New York"]
["Hong Kong","Dillsburg","New York","Detroit"]
["Dillsburg","New York","Detroit","Hong Kong"]
["New York","Detroit","Hong Kong","Dillsburg"]
["Dillsburg","Hong Kong","Detroit","New York"]
["New York","Dillsburg","Hong Kong","Detroit"]
["Detroit","New York","Dillsburg","Hong Kong"]
["Hong Kong","Detroit","New York","Dillsburg"]
bởi vì đó là chuyến đi ngắn nhất: 13.9
nhưng không
["Dillburg","Detroit","New York","Hong Kong"]
bởi vì nó không phải là ngắn nhất
Xem en.wikipedia.org/wiki/Travelling_salesman_propet
Chấm điểm
Đây là nơi mà nó sẽ thú vị. Bạn lấy số lượng ký tự bạn có, sau đó cắm chúng vào công thức ký hiệu O trong trường hợp xấu nhất. Ví dụ: giả sử bạn viết chương trình vũ phu có 42 ký tự. Như chúng ta đều biết, trường hợp xấu nhất là n!
nơi n
là số của các thành phố. 42! = 1405006117752879898543142606244511569936384000000000, vì vậy đó là điểm số của bạn. Điểm thấp nhất sẽ thắng .
Lưu ý: Tôi cũng đã giải tỏa điều này sau đó, nhưng không chắc chắn làm thế nào để giải quyết nó và hy vọng rằng không ai sẽ nhận thấy. Mọi người đã làm, vì vậy tôi sẽ đi với đề xuất của issacg:
các tùy chọn duy nhất là O (n!) và O (b ^ n n ^ a ln (n) ^ k), và tất cả các giới hạn phải càng chặt chẽ càng tốt với ký hiệu đó
O(n!)
và O(b^n*n^a*ln(n)^k)
, và tất cả các giới hạn phải càng chặt chẽ càng tốt với ký hiệu đó. OP nên làm rõ, mặc dù.
O(n^2*2^n)
, ít hơn nhiều so O(n!)
với n lớn.
O(n!)
nhưng không phải làO(sqrt(n)*n^n/e^n)
khôngO(n!/100000000000000000000)
?