You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 lines
3.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package class_2022_08_4_week;
// 来自美团
// 8.20笔试
// 题目1
// 小美将要期中考试有n道题对于第i道题
// 小美有pi的几率做对获得ai的分值还有(1-pi)的概率做错得0分。
// 小美总分是每道题获得的分数。
// 小美不甘于此决定突击复习因为时间有限她最多复习m道题复习后的试题正确率为100%。
// 如果以最佳方式复习,能获得期望最大总分是多少?
// 输入n、m
// 接下来输入n个整数代表pi%为了简单期间将概率扩大了100倍。
// 接下来输入n个整数代表ai某道题的分值
// 输出最大期望分值精确到小数点后2位
// 数据 1m<=n<=50000
// 简单题, 课上提一下解法即可
// 题目2
// 小团在地图上放了3个定位装置想依赖他们进行定位
// 地图是一个n*n的棋盘
// 有3个定位装置(x1,y1),(x2,y2),(x3,y3),每个值均在[1,n]内。
// 小团在(a,b)位置放了一个信标,
// 每个定位装置会告诉小团它到信标的曼哈顿距离,也就是对于每个点,小团知道|xi-a|+|yi-b|
// 求信标位置,信标不唯一,输出字典序最小的。
// 输入n然后是3个定位装置坐标
// 最后是3个定位装置到信标的曼哈顿记录。
// 输出最小字典序的信标位置。
// 1 <= 所有数据值 <= 50000
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
public class Code03_FindPosition {
public static int[] find(int n,
int[] a, int[] b, int[] c,
int ad, int bd, int cd) {
int[] x1 = null;
int r1 = Integer.MAX_VALUE;
int[] x2 = null;
int r2 = 0;
int[] x3 = null;
int r3 = 0;
if (ad < r1) {
x1 = a;
r1 = ad;
x2 = b;
r2 = bd;
x3 = c;
r3 = cd;
}
if (bd < r1) {
x1 = b;
r1 = bd;
x2 = a;
r2 = ad;
x3 = c;
r3 = cd;
}
if (cd < r1) {
x1 = c;
r1 = cd;
x2 = a;
r2 = ad;
x3 = b;
r3 = bd;
}
// x1 r1 x2 r2 x3 r3
int[] cur = { x1[0] - r1, x1[1] };
Queue<int[]> queue = new LinkedList<>();
HashSet<String> visited = new HashSet<>();
ArrayList<int[]> ans = new ArrayList<>();
queue.add(cur);
visited.add(cur[0] + "_" + cur[1]);
while (!queue.isEmpty()) {
// cur x1为圆心r1为半径的圆周上
cur = queue.poll();
if (
cur[0] >= 1 && cur[0] <= n
&&
cur[1] >= 1 && cur[1] <= n
&&
distance(cur[0], cur[1], x2) == r2
&&
distance(cur[0], cur[1], x3) == r3) {
ans.add(cur);
}
if (ans.size() == 2) {
break;
}
add(cur[0] - 1, cur[1] - 1, x1, r1, queue, visited);
add(cur[0] - 1, cur[1], x1, r1, queue, visited);
add(cur[0] - 1, cur[1] + 1, x1, r1, queue, visited);
add(cur[0], cur[1] - 1, x1, r1, queue, visited);
add(cur[0], cur[1] + 1, x1, r1, queue, visited);
add(cur[0] + 1, cur[1] - 1, x1, r1, queue, visited);
add(cur[0] + 1, cur[1], x1, r1, queue, visited);
add(cur[0] + 1, cur[1] + 1, x1, r1, queue, visited);
}
if (ans.size() == 1
|| ans.get(0)[0] < ans.get(1)[0]
|| (ans.get(0)[0] == ans.get(1)[0] && ans.get(0)[1] < ans.get(1)[1])) {
return ans.get(0);
} else {
return ans.get(1);
}
}
public static void add(int x, int y,
int[] c, int r,
Queue<int[]> queue, HashSet<String> visited) {
String key = x + "_" + y;
if (distance(x, y, c) == r && !visited.contains(key)) {
queue.add(new int[] { x, y });
visited.add(key);
}
}
public static int distance(int x, int y, int[] c) {
return Math.abs(x - c[0]) + Math.abs(y - c[1]);
}
}