मेरे पास एक सरणी है 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 should) है। यह तेजी से करने योग्य होना चाहिए ...
std::vector
? @Scheff - सॉर्टिंग मूल "दूरी" रिश्तों को नष्ट कर देगा।