8.23快手后端笔试(25届游戏开发A卷)
前言
有单选、多选题。占40分,三到编程题60分。
吐槽的是没给数据范围,也不能用自己的编译器。希望可以进面
第二题会的,分享一下思路,谢谢。
编程题
1 dfs
对任意给定的n,输出 1,2,…,n 的所有出栈顺序。
#include<bits/stdc++.h>
#include <deque>
#include <vector>
using namespace std;
/*#define int long long*/
#define endl '\n'
#define P pair<int, int>
#define x first
#define y second
const int maxl = 1e6 + 7;
int n, cnt = 1;
vector<int> path;
deque<int> st;
void dfs(int i) {
if (i == n + 1) {
if (cnt > 20) return;
for (int val : path) cout << val;
for (int val : st) cout << val;
cout << endl;
cnt++;
return;
}
// 删除栈顶元素
if (!st.empty()) {
int tp = st.front();
st.pop_front();
path.push_back(tp);
dfs(i);
st.push_front(tp);
path.pop_back();
}
// 当前元素加入栈
st.push_front(i);
dfs(i + 1);
st.pop_front();
}
void slove() {
cin >> n;
dfs(1);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int t = 1;
/*cin >> t;*/
while(t--) slove();
return 0;
}
## 2
有 n 个任务和 m 个工人。每个任务有一个难度值,每个工人有一个能力值。如果一个工人的能力值大于或等于某个任务的难度值,那么这个工人就可以完成这个任务。现在有 x 个工具,每个工具可以提升一个工人 y 点能力值。请问如何分配这些工具,才能使得工人们最多完成多少个任务?
这题不会,贪心过了 44.4%,就不放代码了
3 动态规划(完全背包,leetcode原题 322.零钱兑换)
这个题面就不写了,自己找原题把,下面是我的代码。
#include<bits/stdc++.h>
#include <cstring>
using namespace std;
/*#define int long long*/
#define endl '\n'
#define P pair<int, int>
#define x first
#define y second
const int maxl = 1e6 + 7;
int n, m;
int a[maxl];
int dp[maxl];
void slove() {
memset(dp, 0x3f, sizeof(dp));
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
dp[0] = 0;
for (int i = 1; i <= n; i++) {
for (int j = a[i]; j <= m; j++) {
dp[j] = min(dp[j], dp[j - a[i]] + 1);
}
}
if (dp[m] > m) cout << 0 << endl; // 这里要输出 0
else cout << dp[m] << endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int t = 1;
/*cin >> t;*/
while(t--) slove();
return 0;
}
#快手笔试题#
查看8道真题和解析