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则无方案 } }