360笔试 360笔试题 0914

笔试时间:2024年09月14日 秋招

历史笔试传送门:2023秋招笔试合集

第一题

题目:传染病防控

R市正在进行传染病防控。R市总共有n个人。具体的,每个人有一个位置(x,y),现在已知有一个是高风险人员,但还未追踪到具体是谁。同时我们定义一个安全距离K。如果某个人和这个高风险人员的距离不超过K,那么这个人也将被列为高风险人员。为了减少防控对市民生活的影响,工作人员希望知道所有可能情况下最多的高风险人员数量。

两个人(x1, y1)(x2, y2)的距离定义为|x1-x2| + |y1-y2|。

输入描述

一行两个整数 n 和 k;

接下来一行包含 n 个整数 x1,x2,...xn;

再接下来一行包含 n 个整数 y1,y2,...yn;

约束条件: 1<=n<=1000, 1<=k,x,y<=1000。

输出描述

输出一个整数,表示感染人数的最大数量。

样例输入

5 2  

8 6 1 5 1  

4 4 3 4 6  

样例输出

3

说明:如果一开始一号人员高风险,则二号人员也会变成高风险,然后四号人员变成高风险,此时高风险人员数量最多为3。

参考题解

先把所有点的距离预处理出来,再用并查集合并距离小于等于k的节点,最后找出最大集合输出最大值即可。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 1100;

int a[N], b[N];
int dist[N][N];
int n, k;
int num[N];
int p[N];
int find(int x) 
{
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}

int main()
{
    
    cin >> n >> k;
    for(int i = 1; i <= n; i ++ ) cin >> a[i];
    for(int i = 1; i <= n; i ++ ) cin >> b[i];
    
    for(int i = 1; i <= n; i ++)
    {
        for(int j = i + 1; j <= n; j ++)
        {
            dist[i][j] = dist[j][i] = abs(a[i] - a[j]) + abs(b[i] - b[j]);
        }
    }
    
    for(int i = 1; i <= n; i ++) p[i] = i, num[i] = 1;
    
    for(int i = 1; i <= n; i ++)
    {
        for(int j = i + 1; j <= n; j ++)
        {
            int px = find(i), py = find(j);
            if(px != py && dist[i][j] <= k)
            {
                p[px] = py;
                num[py] += num[px];
            }
        }
    }
    int res = 0;
    for(int i = 1; i <= n; i ++) res = max(res, num[i]);
    cout << res;
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.Scanner;
import java.util.Arrays;

public class Main {
    static final int N = 1100;
    static int[] a = new int[N], b = new int[N];
    static int[][] dist = new int[N][N];
    static int[] num = new int[N];
    static int[] p = new int[N];
    static int n, k;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        n = scanner.nextInt();
        k = scanner.nextInt();

        for (int i = 1; i <= n; i++) a[i] = scanner.nextInt();
        for (int i = 1; i <= n; i++) b[i] = scanner.nextInt();

        for (int i = 1; i <= n; i++) {
            for (int j = i + 1; j <= n; j++) {
                dist[i][j] = dist[j][i] = Math.abs(a[i] - a[j]) + Math.abs(b[i] - b[j]);
            }
        }

        for (int i = 1; i <= n; i++) {
            p[i] = i;
            num[i] = 1;
        }

        for (int i = 1; i <= n; i++) {
            for (int j = i + 1; j <= n; j++) {
                int px = find(i);
                int py = find(j);
                if (px != py && dist[i][j] <= k) {
                    p[px] = py;
                    num[py] += num[px];
                }
            }
        }

        int res = 0;
        for (int i = 1; i <= n; i++) res = Math.max(res, num[i]);

        System.out.println(res);
        scanner.close();
    }

    private static int find(int x) {
        if (p[x] != x) p[x] = find(p[x]);
        return p[x];
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

import sys
input = sys.stdin.read
from math import abs

N = 1100
a = [0] * N
b = [0] * N
dist = [[0] * N for _ in range(N)]
num = [0] * N
p = [0] * N

def find(x):
    if p[x] != x:
        p[x] = find(p[x])
    return p[x]

def main():
    global n, k

    data = input().split()
    n = int(data[0])
    k = int(data[1])

    a[1:n+1] = map(int, data[2:n+2])
    b[1:n+1] = map(int, data[n+2:2*n+2])

    for i in range(1, n + 1):
        for j in range(i + 1, n + 1):
            dist[i][j] = dist[j][i] = abs(a[i] - a[j]) + abs(b[i] - b[j])

    for i in range(1, n + 1):
        p[i] = i
        num[i] = 1

    for i in range(1, n + 1):
        for j in range(i + 1, n + 1):
            px = 

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

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

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

全部评论

相关推荐

脱壳de龙虾:哥最后一题咋a的bfs只过了0.7
投递京东等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务