ฉันมีอาเร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 + for (ll j = i + k + 1; j < n; ++j)
1: การตรวจสอบที่มีfirst
สามารถตัดออกเช่นกันถ้าจะเริ่มต้นได้เช่นก่อนด้วยmn
mn = a[0] * a[k + 1];
(อาจk
จะต้องมีการตรวจสอบn
ในขั้นต้นเพื่อให้หลักฐานแสดงหัวข้อนี้) แต่ก็ยังคงเป็น O (N²) ต้องทำได้เร็วกว่านี้ ...
std::vector
? @Seff - การเรียงลำดับจะทำลายความสัมพันธ์ "ระยะทาง" ดั้งเดิม