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

