アレイがあり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-並べ替えは元の「距離」関係を破壊します。