小红书笔试
小红书笔试三道题一道都没A,第一题自定义排序91,第二题枚举+回溯55,第三题枚举+回溯0,cout骗了9%
全部评论
// 第二题
// 回溯 枚举
void run(long long& res, int curLen, vector<int> curIDs, const int n, vector<bool>& used, int k, const vector<int>& an, const vector<int>& 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);
}
}
}
可以看一下你的回溯代码吗?我回溯直接报运行时错误了(用例过了)
我感觉第二题能贪心,回溯不剪枝都会超时
我也用的回溯,做了一些剪枝,但还是9%通过
int n, k;
int ret = 0;
vector<int> group;
void Loop(const vector<Info> &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();
}
}
相关推荐
11-15 18:12
北京航空航天大学 算法工程师 点赞 评论 收藏
分享
昨天 18:05
北京化工大学 生物制药岗 点赞 评论 收藏
分享