360笔试第二题AC解法

直接上代码,正好优化到 800ms 将将AC,如果代码有什么优化的可能,或者有了更好的思路欢迎评论

如果想看第一题的思路和第二题的思路,可以看我写的博客2020届360秋招笔试编程题

由于是想要输出加和最大的数字,那么第一位的可能性就是从 M - 10,需要从中选出最大的那个.此时问题就会退化成一个 twosum ,从 M - 10 遍历,优先获得高的.

其实解题思路很简单,就是贪心,最最关键的是如何减少运算中的计算量.

#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公司##笔试题目#
全部评论

相关推荐

牛客5655:其他公司的面试(事)吗
点赞 评论 收藏
分享
Natrium_:这时间我以为飞机票
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-27 10:52
点赞 评论 收藏
分享
评论
4
29
分享
牛客网
牛客企业服务