値がそれぞれ相違なる場合を仮定して、以下の つの場合における本問題の答えをそれぞれ考えてみましょう。
[1] A に 0 以上の数と負の数の両方が含まれている場合
[2] A に 0 以上の数のみが含まれている場合
[3] A に負の数のみが含まれている場合
[1] の場合は、最小の数と最大の数を選ぶことにより最小値を達成できます。
[2] の場合は、最小の数と 番目に小さい数を選ぶことにより最小値を達成できます。
[3] の場合は、最大の数と 番目に大きい数を選ぶことにより最小値を達成できます。
同じ値が複数含まれている場合も同様の場合分けをして解くことができるため、この問題を十分高速に解くことができました。
#include<bits/stdc++.h> using namespace std; int main(){ int n; cin >> n; vector<long long> a(n); for(int i = 0; i < n; i++){ cin >> a[i]; } sort(a.begin(), a.end()); long long ans = min({a[0] * a[n - 1], a[0] * a[1], a[n - 2] * a[n - 1]}); cout << ans << "\n"; }