cuốn sách gpt4 ai đã làm

arrays - 求 A[i] 与常数之差的最小总和

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 06:17:08 30 4
mua khóa gpt4 Nike

Đối với một bài tập, tôi cần phải giải một bài toán. Tôi đã thu hẹp nó xuống như sau:

làm A[1, ...,n]n Mảng số nguyên.

làmy là một hằng số nguyên.

Bây giờ tôi phải viết một thuật toán có thể TRÊN) được tìm thấy trong thời gian Của tôi) Giá trị tối thiểu của:

M(y) = Tổng |A[i] - y|, i = 1 đến n. Lưu ý rằng tôi không chỉ sử dụng A[i]-y, cũng lấy giá trị tuyệt đối của |A[i] - y|.

Để rõ ràng, tôi cũng đặt phương trình này vào Wolfram Alpha 中.

Tôi đã xem xét bình phương tối thiểu, nhưng tôi không nghĩ điều đó sẽ mang lại Của tôi) giá trị tối thiểu, nhưng nhiều hơn nữa MỘT giá trị trung bình. Vì tôi đang sử dụng A[i]-y giá trị tuyệt đối của , nên tôi cũng không thể so sánh hàm này với y phân biệt. Ngoài ra, tôi không thể nghĩ ra bất kỳ thuật toán nào vì tôi phải thực hiện nó trong TRÊN) Hoàn thành trong thời gian. Hơn nữa, tôi tin rằng trong một số trường hợp y Có thể có nhiều câu trả lời đúng hơn, trong trường hợp đó,y Giá trị phải bằng Một trong các phần tử nguyên>A.

Điều này thực sự khiến tôi băn khoăn cả tuần nay mà vẫn chưa tìm ra nguyên nhân. Có ai có thể chỉ cho tôi cách đi hoặc chỉ cho tôi hướng đi đúng không? Tôi bị mắc kẹt. Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn.

câu trả lời hay nhất

bạn có muốn không M(y) = sum(abs(A[i] - y)) Chọn a y nhỏ nhất. Chúng ta hãy giả sử rằng mỗi Một [tôi]là dương (nó không làm thay đổi kết quả vì bài toán là bất biến dịch thuật).

Hãy bắt đầu với hai quan sát đơn giản. Đầu tiên, nếu bạn chọn y như thế này y < phút(A)hoặc y > tối đa(A) , giá trị của M(y) cuối cùng bạn nhận được lớn hơn giá trị của y bạn chọn, vì vậy phút(A) <= y <= max(A) .Hơn nữa, A có mức tối thiểu cục bộ hoặc phạm vi giá trị tối thiểu duy nhất (M(y) là lồi).

Vì vậy chúng ta có thể bắt đầu từ trong khoảng [phút(A) .. max(A)] Bắt đầu bằng cách chọn một số y và cố gắng di chuyển giá trị này để chúng ta có được M(y) nhỏ hơn. Để dễ hiểu hơn, hãy sắp xếp A và [1 .. n] Chọn một i (vì vậy y = A[i] ).

Có ba tình huống cần xem xét.

nếu nhưA[i+1] > A[i] , hoặc {n là số lẻ và tôi < (n+1)/2 } hoặc {n là số chẵn và tôi < n/2 }, Sau đó M(A[i+1]) < M(A[i]) .
Điều này là do, từ M(A[i])M(A[i+1]) , số lượng thuật ngữ giảm (tức là ni ) lớn hơn số lượng số hạng tăng lên (tức là Tôi ) và số lượng tăng hoặc giảm luôn không đổi. Khi n là số lẻ thìtôi < (n+1)/2 <=> 2*i < n+1 <=> 2*i < n , vì 2*i là số chẵn (và do đó phải nhỏ hơn số chẵn lớn hơn mà chúng ta trừ đi một).
Nói một cách chính thức hơn,M(A[i]) = tổng(A[i]-A[s]) + tổng(A[g]-A[i]) , trong đó s và g đại diện cho các chỉ số đó A[s] < A[i]A[g] > A[i] .vậy nếuA[i+1] > A[i] , Sau đó M(A[i+1]) = sum(A[i]-A[s]) + i*(A[i+1]-A[i]) + sum(A[g]-A[i] ) - (ni)*(A[i+1]-A[i]) = M(A[i]) + (2*in)*(A[i+1]-A[i]) .từ 2*tôi < nA[i+1] > A[i] , (2*in)*(A[i+1]-A[i]) < 0 , Vì thế M(A[i+1]) < M(A[i]) .

Tương tự, nếuA[i-1] < A[i] , hoặc {n là số lẻ và tôi > (n+1)/2 } hoặc {n là số chẵn và tôi > (n/2)+1 }, Sau đó M(A[i-1]) > M(A[i]) .

Cuối cùng, nếu {n lẻ và tôi = (n+1)/2 } hoặc {n là số chẵn và i = (n/2) hoặc (n/2)+1 }, thì bạn có mức tối thiểu, vì việc giảm hoặc tăng dần nên cuối cùng tôi sẽ dẫn bạn đến trường hợp thứ nhất hoặc thứ hai tương ứng. Vẫn còn các giá trị có thể có cho i, nhưng tất cả chúng đều dẫn đến A[i] cũng là giá trị tối thiểu.

Trung vị của A chính xác là giá trị A[i] mà tôi thỏa mãn trường hợp cuối cùng. Nếu số phần tử của A là số lẻ thì chỉ có một giá trị như vậy,y = A[(n+1)/2] (nhưng có thể có nhiều chỉ mục); nếu nó chẵn thì bạn có một phạm vi (có thể chỉ chứa một số nguyên) các giá trị như thế này,A[n/2] <= y <= A[n/2+1] .

Có một thuật toán C++ tiêu chuẩn có thể giúp bạn tìm trung vị trong thời gian O(n):phần tử thứ n .Nếu bạn nói ngôn ngữ khác, vui lòng tìm thuật toán trung vị của trung vị (Nico Schertler chỉ ra )thậm chí chọn lọc nội tâm (Đây là mục đích thường được sử dụng của nth_element).

Về mảng - tìm tổng tối thiểu của sự khác biệt giữa A[i] và hằng số, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/39756662/

30 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress