华为今晚笔试第三题有用最大堆和最小堆做的吗

调了一个小时,最后有点小问题,不知思路是否可以ac本题

#华为##笔试题目#
全部评论
当时自己犯了很蠢的错误,用Python写一直ac不了,所以搞了两个版本,后来发现都改好了,两个都能AC C++版本: #include <iostream> #include <cstdio> #include <vector> #include <algorithm> #define MAX(a,b) ((a) > (b) ? (a) : (b)) using namespace std; int main(){     int t, res_m, res_f;     cin >> t;     for(int i = 0; i < t; i++){         int n;         res_m = 0;         res_f = 0;         cin >> n;         vector<int> v;         for(int j = 0; j < n; j++){             int x; scanf("%d",&x);             vector<int>::iterator pos_left,pos_right;             pos_left = std::lower_bound(v.begin(), v.end(), x);             pos_right = std::upper_bound(pos_left, v.end(), x);             int lo = pos_left - v.begin();             int hi = pos_right - v.begin();             v.insert(v.begin()+hi, x);             res_f += lo + hi - j;             res_m = MAX(res_m, res_f);         }         cout << res_m << ' ' << res_f << endl;     }     return 0; } Python 版本: import bisect T = int(input()) class my_class(object):     __slots__ = ['array', 'res_m', 'res_f']     def __init__(self, lst):         array = []         res_m, res_f = 0, 0         n = len(lst)         for i, x in enumerate(lst):             pos_left = bisect.bisect_left(array, x)             pos_right = bisect.bisect_right(array, x, pos_left)             res_f += pos_left + pos_right - i             res_m = max(res_m, res_f)             array.insert(pos_right, x)         print(res_m, res_f) for _ in range(T):     n = int(input())     lst = list(map(int, input().split()))     my_class(lst)
点赞 回复
分享
发布于 2019-09-26 10:26
两个堆,只过了20%,然后还是超时
点赞 回复
分享
发布于 2019-09-25 21:23
滴滴
校招火热招聘中
官网直投

相关推荐

头像
今天 16:45
已编辑
东北大学 自动化类
点赞 评论 收藏
转发
1 1 评论
分享
牛客网
牛客企业服务