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多种语言版本,持续更新中。