import java.util.*; public class 1444 { static class Pumpkin { int id; int x; int y; double distance; public Pumpkin(int id, int x, int y, int startX, int startY) { this.id = id; this.x = x; this.y = y; this.distance = Math.sqrt(Math.pow(x - startX, 2) + Math.pow(y - startY, 2)); } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); Pumpkin[] pumpkins = new Pumpkin[n]; for (int i = 0; i < n; i++) { int x = scanner.nextInt(); int y = scanner.nextInt(); pumpkins[i] = new Pumpkin(i + 1, x, y, pumpkins[0].x, pumpkins[0].y); } Arrays.sort(pumpkins, (p1, p2) -> Double.compare(p1.distance, p2.distance)); List<Integer> result = new ArrayList<>(); result.add(pumpkins[0].id); int prevX = pumpkins[0].x; int prevY = pumpkins[0].y; double maxDistance = pumpkins[0].distance; for (int i = 1; i < n; i++) { if (pumpkins[i].distance > maxDistance) { maxDistance = pumpkins[i].distance; prevX = pumpkins[i - 1].x; prevY = pumpkins[i - 1].y; result.add(pumpkins[i].id); } else { double distance = Math.sqrt(Math.pow(pumpkins[i].x - prevX, 2) + Math.pow(pumpkins[i].y - prevY, 2)); if (distance < pumpkins[i].distance) { break; } } } System.out.println(result.size()); for (int i : result) { System.out.println(i); } } }解释一下代码运行的过程并说出他的计算复杂度
时间: 2024-04-27 09:24:07 浏览: 77
java.util包总结
这段代码的功能是在二维平面上给定 n 个南瓜的坐标,找出一些南瓜,使得它们的欧几里得距离最大,且这些南瓜按照输入顺序排列的位置在它们之前的南瓜的欧几里得距离都小于它们之间的欧几里得距离,输出这些南瓜的编号和数量。
首先,代码读入了 n 个南瓜的坐标,并计算出它们到第一个南瓜的欧几里得距离,然后按照欧几里得距离从小到大排序。接下来,从第一个南瓜开始遍历排好序的南瓜数组,如果当前南瓜的欧几里得距离大于前面的所有南瓜的欧几里得距离,就将当前南瓜加入结果集合中,并更新最大距离和当前南瓜的坐标。否则,计算当前南瓜到前面最后一个南瓜的距离,如果这个距离小于当前南瓜到第一个南瓜的距离,就结束遍历。
代码的时间复杂度为 O(nlogn),主要是因为排序的时间复杂度为 O(nlogn),其它部分的时间复杂度为 O(n)。
阅读全文