4.23网易雷火笔试

各位大佬能帮忙看看哪里有问题吗?我把我的思路写在注释里了
第一题
//18.33%
#include<bits/stdc++.h>
using namespace std;
bool pd(string s) {  //判断字符串是否有 1-6 中的重复数字 
    int a[6] = {0};
    for (auto c: s) {
        ++a[c - '1'];
        if (a[c - '1'] > 1) {
            return false;
        }
    }
    return true;
}
bool pdl(vector<string> &v) {
    for (int i = 0; i < 6; ++i) {  //判断每一列是否有重复数字 
        string tmp1 = "";
        for (auto s: v) { tmp1 += s[i];
        }
        if (!pd(tmp1))  return false;
    }
    for (int j = 0; j < 6; j += 2) {  //判断每个宫是否有重复 
        string tmp2 = v[j].substr(0, 3) + v[j + 1].substr(0, 3);
        string tmp3 = v[j].substr(3, 3) + v[j + 1].substr(3, 3);
        if (!pd(tmp2) || !pd(tmp3))  return false;
    }
    return true;
}
int main() {
    int n;
    cin >> n;
    int cnt = 0;  //记录结果 
    while (n--) {
        vector<string> v;
        for (int i = 0; i < 6; ++i) {
            string s;
            cin >> s;
            if (!pd(s))  goto flag;  //判断每一行字符串是否有重复,如果有,则这一个数独错误,直接进入下一个循环 
            v.emplace_back(s);
        }
        if (pdl(v))  ++cnt;
        flag:
            continue ;
    }
    cout << cnt << endl;
}

第二题
看大家好像初始化为inf,想知道初始化为0为啥不行
//15%
#include<bits/stdc++.h>
using namespace std;

int main() {
    int M;
    cin >> M;
    while (M--) {
        int hp, low, up, n;
        cin >> hp >> low >> up >> n;
        vector<int> v;
        int mmax = 0;  //记录技能伤害最大值,用于设定背包上限 
        for (int i = 0; i < n; ++i) {
            int d;
            cin >> d;
            mmax = max(d, mmax);
            v.push_back(d);
        }
        vector<int> dp(hp + mmax + 1, 0);  //dp[j]表示前i种技能,造成j伤害的最少攻击数 (完全背包) 
        dp[0] = 0;
        for (int i = 0; i < v.size(); ++i) {
            for (int j = v[i]; j <= hp + mmax; ++j) {
                if (dp[j])  //如果 dp[j]不为 0 
                    dp[j] = min(dp[j], dp[j - v[i]] + 1);
                else  //如果为 0,即在 0 - i-2 种技能中选择,无法刚好造成 j 伤害,则将其设置为这次的结果 
                    dp[j] = dp[j - v[i]] + 1;
            }
        }
        int ret = INT_MAX;
        for (int i = hp - up; i <= hp - low; ++i) {  //对于目标范围内的伤害值,如果dp[i]不为 0, 这说明有方案,取其中最小值 
            if (dp[i])
                ret = min(ret, dp[i]);
        }
        cout << (ret == INT_MAX ? 0 : ret) << endl;  //ret为INT_MAX则无方案
    }
}



#实习##笔试题目##C/C++#
全部评论
你第一题输入时就判断行,不符合条件就continue,但是你忘了这个数独还没输入完...剩下的被你当成下一组数据的一部分了
1 回复 分享
发布于 2022-04-24 12:02
第二题的else判断好像有点问题,与定义相违背,会让所有大于v[i]的j都被更新,这样就多了一种方案,但实际上此时无法使伤害刚好达到j;而设置为inf就会更新为inf+1,依旧是无法刚好造成j伤害,符合背包定义
1 回复 分享
发布于 2022-04-24 11:50

相关推荐

劝退式:感觉有人回才是不正常的
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务