Mam tablicę a[n]
. Numer n
jest 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ą first
można również wyeliminować, jeśli mn
zostanie zainicjowane przed np mn = a[0] * a[k + 1];
. Za pomocą . (Być może k
należy to sprawdzić na n
począ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”.