09/22快手笔试
第一题
没看懂题目意思,但
cout << 111 << endl;
AC了,请求各位大老爷们没必要再考我们语文了,没Offer已经够难受了!
第二题,动态规划
题的具体内容不记得了,不相邻元素的最大和?
代码:
#include <bits/stdc++.h>
using namespace std;
int func(const vector<int>& v, vector<int>& indexes) {
int size = v.size();
vector<int> dp(size); // dp[i]表示以位置i处元素结尾的元素所能获取的最大值
vector<vector<int>> dp_index(size, vector<int>());
dp[0] = v[0];
dp_index[0].push_back(0);
if (v[1] > v[0]) {
dp_index[1].push_back(1);
dp[1] = v[1];
}
else {
dp_index[1] = dp_index[0];
dp[1] = v[0];
}
for (int i = 2; i < size; ++i) {
if (dp[i - 1] < dp[i - 2] + v[i]) {
dp_index[i] = dp_index[i - 2];
dp_index[i].push_back(i);
dp[i] = dp[i - 2] + v[i];
}
else {
dp_index[i] = dp_index[i - 1];
dp[i] = dp[i - 1];
}
}
indexes = dp_index[size - 1];
return dp[size - 1];
}
int main () {
vector<int> v;
int n;
while (cin >> n)
{
v.push_back(n);
if (cin.get() == '\n') break;
}
vector<int> index;
int res = func(v, index);
for_each(index.begin(), index.end(), [](int x) { cout << x << " "; });
cout << '\n' << res << endl;
return 0;
}
第三题,分割等和子集;
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> vec(n);
int sum = 0;
int biggest_value = 0;
for (int i = 0; i < n; ++i) {
cin >> vec[i];
sum += vec[i];
biggest_value = max(biggest_value, vec[i]);
}
if (sum % 2 || sum / 2 < biggest_value) cout << 0 << endl;
else {
int target = sum / 2;
vector<vector<bool>> dp(n, vector<bool>(target + 1)); // 已经给定正整数
dp[0][vec[0]] = true;
for (int i = 1; i < n; ++i) {
for (int j = 1; j <= target; ++j) {
if (vec[i] <= j) dp[i][j] = dp[i - 1][j] | dp[i - 1][j - vec[i]];
else dp[i][j] = dp[i - 1][j];
}
}
if (dp[n - 1][target]) cout << 1 << endl;
else cout << 0 << endl;
}
return 0;
}
// 64 位输出请用 printf("%lld")
#快手##现在还是0offer,延毕还是备考#