【发布时间】:2020-04-29 06:45:00
【问题描述】:
我有一个数组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;
}
但我想知道是否有更快的方法来找到距离最小的产品?
【问题讨论】:
-
Why should I not #include <bits/stdc++.h>? 和 C++ 仅通过编译器扩展提供 可变长度数组。你为什么不使用
std::vector? @Scheff - 排序会破坏原来的“距离”关系。 -
至少可以去掉检查
if (i!=j) if (abs(i - j) > k)。只需在 i + k + 1 处开始内循环:for (ll j = i + k + 1; j < n; ++j)。如果mn事先被初始化,例如first的检查也可以被消除。与mn = a[0] * a[k + 1];。 (也许,k最初应该与n核对以防弹。)但它仍然是 O(N²)。这必须更快... -
@PaulMcKenzie 请在前十个具有索引距离的最小产品中显示一个查询,其中不少于两个有用命中i>(或最大)。
-
@PaulMcKenzie “可能有数百个(如果不是数千个)显示此问题答案的 URL 链接。” -- 请至少分享其中三个网址。
-
这个问题是从哪里来的?这听起来不像是凭空捏造的东西。如果它来自那些“在线法官”网站之一,我不会感到惊讶。如果是这样,那么在这些网站上可能会针对解决问题进行冗长的讨论,如果不是完整的解决方案的话。
标签: c++ algorithm optimization minimum