360笔试第二题AC解法
直接上代码,正好优化到 800ms 将将AC,如果代码有什么优化的可能,或者有了更好的思路欢迎评论
如果想看第一题的思路和第二题的思路,可以看我写的博客2020届360秋招笔试编程题。
由于是想要输出加和最大的数字,那么第一位的可能性就是从 M - 1 到 0,需要从中选出最大的那个.此时问题就会退化成一个 twosum ,从 M - 1 到 0 遍历,优先获得高的.
其实解题思路很简单,就是贪心,最最关键的是如何减少运算中的计算量.
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int main() {
int N, M; cin >> N >> M;
unordered_map<int, int> nums1, nums2;
vector<int> sum(M, 0);
int tmp;
for(int i = 0; i < N; ++i){
cin >> tmp;
++nums1[tmp];
}
for(int i = 0; i < N; ++i){
cin >> tmp;
++nums2[tmp];
}
int lr, mr;
for(int i = M - 1; i >= 0; --i){
auto nit1 = nums1.begin();
while(nit1 != nums1.end()){
lr = i - nit1->first;
mr = M + i - nit1->first;
if(nums2.find(lr) != nums2.end()){
if(nums2[lr] <= nit1->second){
tmp = nums2[lr];
nums2.erase(lr);
}else{
tmp = nit1->second;
nums2[lr] -= tmp;
}
nit1->second -= tmp;
sum[i] += tmp;
}
if(nums2.find(mr) != nums2.end()){
if(nums2[mr] <= nit1->second){
tmp = nums2[mr];
nums2.erase(mr);
}else{
tmp = nit1->second;
nums2[mr] -= tmp;
}
nit1->second -= tmp;
sum[i] += tmp;
}
if(nit1->second == 0){
nums1.erase(nit1++);
}else{
++nit1;
}
}
}
for(int i = M - 1; i >= 0; --i){
for(int j = 0; j < sum[i]; ++j){
cout << i << ' ';
}
}
cout << endl;
return 0;
} #360公司##笔试题目#