金山笔试 金山笔试题 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%内容,订阅专栏后可继续查看/也可单篇购买

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论

相关推荐

金山干嘛,挂了又发笔试,复活赛还是KPI
苏_Official:我投了三个base,做了两次笔试然后复筛都挂了,今天他还发笔试,有点离谱了
投递金山WPS等公司10个岗位 > 软件开发2024笔面经 牛客创作赏金赛
点赞 评论 收藏
分享
点赞 3 评论
分享
牛客网
牛客企业服务