huawei 笔试


欢迎探讨解法,仅为了看大家怎么解答这种题目。
1. 300分 给出M个货物的大小,求一个容量ans,你可以提供两个ans大小的仓库,来放下M个货物,求ans的最小值。 例如 M=3  17 8 11. 答案为19 两个19的仓库可以放下11+8, 17 的货物,且 19为最小值。
2. 100分 给出N个时间,秒,为在第i个页面停留的时间, 要求60s内浏览的页面不能超过4个。 例如10 10 10 10 10 10  为false, 10 120 10 40. 第一个60s浏览了1个页面, 第二个60秒 0个页面, 第三个60秒 3个页面 为true; long long
3. 较为复杂的字符串是否符合规则的题目, 大概为规则1:正常文本,带空格不带其它符号的英文文本。 第二第三(文本|文本) [文本|文本]  同为|两边不能为空,|可有可无。  第四{数字,数字} 必须包含两个数字。这道题不给错误案例,规则太繁琐了。
全部评论
第一题就是组合问题,先求出数组总和的一半target 再dfs看有没有最接近target的组合,有就更新。 void two_can(vector<int>& nums, vector<bool>& used,int start, int sum,double target,vector<int>& track,int& ans) {     if(sum > ans) return; //超过之前较优解ans,剪枝     if(sum >= target)     //满足 >= target 且小于之前较优解 ans,进来更新较优解ans     {         ans = sum;        //最后ans就是答案         res.push_back(track);         return;     }     for(int i = start; i <nums.size();i++)     {         if(i > 0 && nums[i] == nums[i-1] && !used[i-1]) continue;//跳过重复元素         sum += nums[i];         track.push_back(nums[i]);         used[i] = true;         two_can(nums,used,i+1,sum,target,track,ans);         used[i] = false;         track.pop_back();         sum -= nums[i];     } }
点赞 回复 分享
发布于 2020-07-25 16:36
第一题类似于背包的DP吧,申请一个sum/2大小的数组就可以了。第二个滑动窗口吧。第三个没看明白题目
点赞 回复 分享
发布于 2020-07-25 18:18

相关推荐

点赞 评论 收藏
分享
评论
2
12
分享
牛客网
牛客企业服务