Tôi có một mảng a[n]. Số nđược nhập bởi chúng tôi. Tôi cần tìm sản phẩm tối thiểu của a[i]và a[j]nếu:
1) abs(i - j) > k
2) a[i] * a[j]được giảm thiểu
Đây là giải pháp của tôi (rất ngây thơ):
#include <iostream>
using namespace std;
#define ll long long
int main() {
ll n,k; cin >> n >> k;
ll a[n]; for(ll i=0;i<n;i++) cin >> a[i];
ll mn; bool first = true;
for(ll i=0;i<n;i++) {
for(ll j=0;j<n;j++) {
if(i!=j)
if(abs(i-j) > k) {
if(first) {
mn = a[i]*a[j];
first = false;
} else if(a[i]*a[j] < mn) mn = a[i]*a[j];
}
}
}
cout << mn << endl;
}
Nhưng tôi muốn biết liệu có cách nào nhanh hơn để tìm một sản phẩm tối thiểu với khoảng cách không?
if (i!=j) if (abs(i - j) > k)có thể được loại bỏ. Chỉ cần bắt đầu vòng lặp bên trong tại i + k + 1 : for (ll j = i + k + 1; j < n; ++j). Việc kiểm tra firstcũng có thể được loại bỏ nếu mnđược khởi tạo trước, ví dụ như với mn = a[0] * a[k + 1];. (Có lẽ, knên được kiểm tra nban đầu để chống đạn này.) Nhưng nó vẫn là O (N²). Điều này phải được thực hiện nhanh hơn ...
std::vector? @Scheff - sắp xếp sẽ phá hủy các mối quan hệ "khoảng cách" ban đầu.