題目鏈接:傳送門
思路:把兩個給出的組存入數組,從小到大排序,然後先從0下標開始計算負數,兩兩配對,然後算正數,同理。 有一個需要注意的點我本來是隻是從0-n-1掃描一遍,把正數加入答案的,扣了幾分,因爲配對順序可能會錯,本來應該最大的正數相乘,而這樣做結果可能會變小。
代碼:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector <ll> va , vb;
int main() {
int nc , np , t;
ios::sync_with_stdio(0);
cin >> nc;
for(int i = 0 ; i < nc ; i++) {
cin >> t;
va.push_back(t);
}
cin >> np;
for(int i = 0 ; i< np ; i++) {
cin >> t;
vb.push_back(t);
}
sort(va.begin() , va.end());
sort(vb.begin() , vb.end());
ll ans = 0;
for(int i = 0 , j = 0 ; i < va.size() && j < vb.size() ; i++ , j++) {
if(va[i] < 0 && vb[j] < 0)ans += va[i] * vb[j];
else break;
}
for(int i = va.size() - 1 , j = vb.size() - 1 ; i >= 0 && j >= 0 ; i-- , j--) {
if(va[i] > 0 && vb[j] > 0)ans += va[i] * vb[j];
else break;
}
cout << ans << "\n";
return 0;
}