金山笔试 金山笔试题 0929
笔试时间:2024年09月29日 秋招
历史笔试传送门:2023秋招笔试合集
第一题
题目
小红有a个桃子,b个苹果,c个雪梨。她现在想将这些水果装到篮子里。每个篮子需要刚好装15个水果,一个篮子最少装4个桃子,3个苹果,
个苹果,2个雪梨。小红想知道最多使用多少个篮子?
输入描述
第一行输入一个正整数t,代表询问的次数。
接下来的t行,每行输入一行三个正整数a,b,c,分别表示桃子、苹果、雪梨的数量。
1≤t≤10^5,1≤a,b,c≤ 10^9。
输出描述
输出t行,每行输出一个正整数,表示答案。
样例输入
2
6 5 5
20 6 4
样例输出
1
2
参考题解
二分答案,在去掉必须的水果之后,判断剩余的水果够不够填充。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <bits/stdc++.h> using namespace std; #define ll long long void solve() { int a, b, c; cin >> a >> b >> c; int l = 0, r = min({a / 4, b / 3, c / 2}); while (l < r) { int mid = (l + r + 1) >> 1; int A = mid * 4; int B = mid * 3; int C = mid * 2; bool ok = true; if (A > a || B > b || C > c) { ok = false; } ll remain = a - A + b - B + c - C; if (remain < 6 * mid) { ok = false; } if (ok) { l = mid; }else { r = mid - 1; } } cout << l << "\n"; } int main() { int t; cin >> t; while (t--) { solve(); } }
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.*; public class Main { public static void solve() { Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int b = sc.nextInt(); int c = sc.nextInt(); int l = 0; int r = Math.min(Math.min(a / 4, b / 3), c / 2); while (l < r) { int mid = (l + r + 1) / 2; int A = mid * 4; int B = mid * 3; int C = mid * 2; boolean ok = true; if (A > a || B > b || C > c) { ok = false; } long remain = a - A + b - B + c - C; if (remain < 6 * mid) { ok = false; } if (ok) { l = mid; } else { r = mid - 1; } } System.out.println(l); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int t = sc.nextInt(); while (t-- > 0) { solve(); } } }
Python:[此代码未进行大量数据的测试,仅供参考]
def solve(): a, b, c = map(int, input().split()) l, r = 0, min(a // 4, b // 3, c // 2) while l < r: mid = (l + r + 1) // 2 A = mid * 4 B = mid * 3 C = mid * 2 ok = True if A > a or B > b or C > c: ok = False remain = a - A + b - B + c - C if remain < 6 * mid: ok = False if ok: l = mid else: r = mid - 1 print(l) def main(): t = int(input()) for _ in range(t): solve() if __name__ == "__main__": main()
第二题
题目
小红正在玩一个战争棋盘,棋盘可以视为一个n行m列的矩阵。小红初始往棋盘上投放了k支军队,每个军队属于不同势力。每回合,小红可以任选一个军队按"上、下、左、右"四种方向中的一种移动一个方格,会出现以下4种情况:1.当这个军队移动到一个未被任何势力占领的格子,则军队移动成功,并将其占领。2.当这个军队移动到自己势力的格子,此时军队移动成功。3.若这个军队将移出地图的边界,将移动失败。该军队原地不动。4.若这个军队将移动到另外一个势力的格子,那么两个势力将发生冲突,拥有较多领土的势力将获胜,并占领对方所有领土,消灭对方的军队。特殊的,若两个冲突的势力领土数量相等,那么势力名字的字典序较大者获胜。如果进攻方获胜,则进攻方移动成功。如果防守方获胜,那么防守方的军队保持原来的位置。请你在每次移动操作后输出当前操作的结果。ps:若投放军队的时候有两个或多个军队在同一格子,则直接发生冲突,名字字典序最大的那个势力存活,其他势力消亡。
输入描述
第一行输入n,m,k,分别代表棋盘的行数,列数,以及势力的数量。
接下来k行,每行一个字符串str,x,y。str代表势力的名称,保证所有势力名称不同。x和y代表势力的起始位置。
接下来一个整数q,代表回合数。接下来q行,每行出入一个字符串str和一个字符c。str代表势力的名称,c代表这次移动的方向(W,A,S,D W代表向上走,A向左走,S向下走,D向右走)。
1 <= n, m <= 500
1 <= k <= min(n * m, 2 * 10^4)
1 <= x <= n, 1 <= y <= m
1 <= q <= 2 * 10^4
保证str长度不超过10,仅包含小写英文字母,保证c为(W,A,S,D)中的一个。
输出描述
对于每次操作,输出一行答案:
若本次移动占领了新的边界,则输出一行字符串"vanquish!"
若本次移动到了自己的领土,则输出一行字符串"peaceful."
若本次由于将移出边界导致移动失败,则输出一行字符串"out of bounds!"
若本次移动发生了冲突,胜利者是xxx,则输出一行字符串"xxx wins!”(xxx为势力名字)若输入了不存在的势力,或者输入的字符串代表的势力已经败北则输出一行字符串"unexisted empire."
样例输入
3 3 2
ranko 1 1
kotori 2 2
5
ranko D
ranko W
ranko A
kotori W
kotori W
样例输出
vanquish!
out of bounds!
peaceful.
ranko wins!
unexisted empire.
参考题解
维护一个并查集,并且维护每个格子被谁占领,并且维护谁现在在哪个位置,然后根据题意进行模拟即可。编码可能有点复杂,需要细心。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <bits/stdc++.h> using namespace std; int main() { int n, m, k; cin >> n >> m >> k; unordered_map<string, pair<int, int>> mp; vector<vector<string>> grid(n, vector<string>(m)); vector<int> f(n * m), cnt(n * m); for (int i = 0; i < n * m; i++) { f[i] = i; cnt[i] = 1; } auto transform = [&](int x, int y) -> int { return x * m + y; }; auto father = [&](auto self, int i) -> int { if (f[i] == i) return i; return f[i] = self(self, f[i]); }; auto connect = [&](int i, int j) -> void { int fi = father(father, i); int fj = father(father, j); if (fi != fj) { f[fj] = fi; cnt[fi] += cnt[fj]; } }; for (int i = 0; i < k; i++) { string name; int x, y; cin >> name >> x >> y; x--, y--; if (grid[x][y] == "") { grid[x][y] = name; mp[name] = {x, y}; }else { string enemy = grid[x][y]; if (enemy < name) { grid[x][y] = name; mp[name] = {x, y}; mp.erase(enemy); } } } int q; cin >> q; for (int i = 0; i < q; i++) { string name; cin >> name; char c; cin >> c; if (!mp.count(name)) { cout << "unexisted empire." << "\n"; continue; } pair<int, int> p = mp[name]; int x = p.first, y = p.second; int nx = x, ny = y; if (c == 'W') { nx--; }else if (c == 'A') { ny--; }else if (c == 'S') { nx++; }else { ny++; } if (nx < 0 || nx >= n || ny < 0 || ny >= m) { cout << "out of bounds!" << "\n"; continue; } int fa1 = father(father, transform(x, y)); int fa2 = father(father, transform(nx, ny)); if (fa1 == fa2) { cout << "peaceful." << "\n"; mp[name] = {nx, ny}; continue; } int fa_nx = fa2 / m; int fa_ny = fa2 % m; if
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。