小红书笔试

小红书笔试三道题一道都没A,第一题自定义排序91,第二题枚举+回溯55,第三题枚举+回溯0,cout骗了9%
全部评论
// 第二题 // 回溯 枚举 void run(long long&amp; res, int curLen, vector<int> curIDs, const int n, vector<bool>&amp; used, int k, const vector<int>&amp; an, const vector<int>&amp; bn){ if(curLen == k) { long long sum = 0; int minV = INT_MAX; for(int i = 0; i < k; ++i){ sum += an[curIDs[i]]; minV = min(minV, bn[curIDs[i]]); } res = res < sum * minV ? sum * minV : res; return; } for(int i = 0; i < n; ++i){ if(used[i] == false){ curIDs.emplace_back(i); used[i] = true; run(res, curLen+1, curIDs, n, used, k, an, bn); used[i] = false; curIDs = vector<int>(curIDs.begin(), curIDs.end()-1); } } }
1 回复 分享
发布于 04-07 21:57 河南
可以看一下你的回溯代码吗?我回溯直接报运行时错误了(用例过了)
点赞 回复 分享
发布于 04-07 21:15 重庆
我感觉第二题能贪心,回溯不剪枝都会超时
点赞 回复 分享
发布于 04-07 21:37 辽宁
我也用的回溯,做了一些剪枝,但还是9%通过 int n, k; int ret = 0; vector<int> group; void Loop(const vector<Info> &amp;infos, int i, int m) { if (group.size() + n - m - 1 < k) return; if (i == k) { int a_sum = 0, b_min = -1; for (int j = 0; j < k; ++j) { a_sum += infos[group[j]].a; if (b_min == -1) b_min = infos[group[j]].b; else b_min = min(b_min, infos[group[j]].b); } ret = max(ret, a_sum * b_min); return; } for (int j = m + 1; j < n; ++j) { group.push_back(j); Loop(infos, i + 1, j); group.pop_back(); } }
点赞 回复 分享
发布于 04-08 18:31 广东

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务