Mam tablicę a[n]. Numer njest wprowadzany przez nas. Muszę znaleźć minimalny produkt a[i]i a[j]jeśli:
1) abs(i - j) > k
2) a[i] * a[j]jest zminimalizowany
Oto moje rozwiązanie (bardzo naiwne):
#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;
}
Ale chcę wiedzieć, czy istnieje szybszy sposób na znalezienie minimalnego produktu z odległością?
if (i!=j) if (abs(i - j) > k)można wyeliminować. Wystarczy uruchomić wewnętrzną pętlę w I + k + 1: for (ll j = i + k + 1; j < n; ++j). Sprawdzanie za pomocą firstmożna również wyeliminować, jeśli mnzostanie zainicjowane przed np mn = a[0] * a[k + 1];. Za pomocą . (Być może knależy to sprawdzić na npoczątku, aby uczynić to kuloodpornym.) Ale wciąż jest to O (N²). To musi być wykonalne szybciej ...
std::vector? @Scheff - sortowanie zniszczyłoby pierwotne relacje „odległości”.