我有一个数组a[n]
。该号码n
由我们输入。我需要找到的最小的产品a[i]
和a[j]
如果:
1) abs(i - j) > k
2)a[i] * a[j]
最小化
这是我的解决方案(非常幼稚):
#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;
}
但是我想知道是否有更快的方法来找到具有距离的最小产品?
if (i!=j) if (abs(i - j) > k)
可以取消检查。只需从i + k + 1开始内部循环for (ll j = i + k + 1; j < n; ++j)
。first
如果mn
事先用初始化,也可以取消的检查mn = a[0] * a[k + 1];
。(也许k
应该先检查一下n
以防弹。)但它仍然是O(N²)。这必须更快地完成...
std::vector
?@Scheff-排序将破坏原始的“距离”关系。