Eu tenho uma matriz a[n]
. O número n
é inserido por nós. Preciso encontrar o produto mínimo a[i]
e a[j]
se:
1) abs(i - j) > k
2) a[i] * a[j]
é minimizado
Aqui está a minha solução (muito ingênua):
#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;
}
Mas quero saber se existe alguma maneira mais rápida de encontrar um produto mínimo com distância?
if (i!=j) if (abs(i - j) > k)
pode ser eliminado. Apenas iniciar o ciclo interior em i + k + 1: for (ll j = i + k + 1; j < n; ++j)
. A verificação com também first
pode ser eliminada se mn
for inicializada anteriormente, por exemplo, com mn = a[0] * a[k + 1];
. (Talvez, k
deva ser verificado n
inicialmente para fazer essa prova de bala.) Mas ainda é O (N²). Isso deve ser possível mais rápido ...
std::vector
? @Scheff - a classificação destruiria os relacionamentos originais de "distância".