배열이 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
하면 검사를 제거 할 수도 있습니다 . (아마도이 방탄을 만들기 위해 초기에 점검해야합니다 .) 그러나 여전히 O (N²)입니다. 이것은 더 빨라야합니다…mn
mn = a[0] * a[k + 1];
k
n
std::vector
않습니까? @Scheff-정렬은 원래의 "거리"관계를 파괴합니다.