360笔试魔塔

求大佬指点,我的代码错在哪了?(暴力dfs+回溯)
int res = 0;
void dfs(vector<int> grade, vector<int> val, int num, int cur,vector<bool> note) {
    //所有关卡打完,看得分是否比原来的大
    if (num == grade.size()) {
        res = max(res, cur);
        return;
    }
    for (int i = 0; i < grade.size(); i++) {
        //如果这关攻略过了,直接跳过
        if (note[i])continue;
        //记录这关得了多少分
        int tmp = 0;
        //这关没有宝物,直接得分
        if (val[i] == 0) {
            tmp = grade[i];
            cur += tmp;
        }
        else {
            if (cur + grade[i] > 2 * cur) {
                tmp = grade[i];
                cur += tmp;
            }
            //有宝物并且翻倍比得分大
            else {
                tmp = cur;
                cur += tmp;
            }
        }
        //表示这关已经攻略过了
        note[i] = true;
        dfs(grade, val, num + 1, cur, note);
        cur -= tmp;
        note[i] = false;
    }
}

int main() {
    int n = 0;      //共有n个关卡
    cin >> n;
    //表示每关可以得多少分
    vector<int> grade(n, 0);
    //表示每关是否有宝物
    vector<int> val(n, 0);
    for (int i = 0; i < n; i++) {
        cin >> grade[i] >> val[i];
    }
    //记录某关是否已经攻略过了
    vector<bool> note(n, false);
    dfs(grade, val, 0, 0, note);
    cout << res;
    return 0;
}


#360笔试##360公司##笔经#
全部评论
没宝物的分数先拿 有宝物的从大到小排序 每次选择的时候判断是乘以二更大还是拿宝物更大 就ok了 O(nlogn)
1 回复 分享
发布于 2022-03-19 22:15
过了多少样例啊?
点赞 回复 分享
发布于 2022-03-19 21:41
这个百度搜原题
点赞 回复 分享
发布于 2022-03-19 21:55
我贪心 过了70。。
点赞 回复 分享
发布于 2022-03-19 22:37
结果使用long型就ok
点赞 回复 分享
发布于 2022-03-20 17:04

相关推荐

评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务