题目链接:传送门
思路:把两个给出的组存入数组,从小到大排序,然后先从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;
}