L3-3 神坛(Java)

简介: L3-3 神坛(Java)

L3-3 神坛(Java)

分数 30a

全屏浏览题目切换布局

作者 邓俊辉

单位 清华大学

在古老的迈瑞城,巍然屹立着 n 块神石。长老们商议,选取 3 块神石围成一个神坛。因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好。特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面积为 0.000。

长老们发现这个问题没有那么简单,于是委托你编程解决这个难题。

输入格式:

输入在第一行给出一个正整数 n(3 ≤ n ≤ 5000)。随后 n 行,每行有两个整数,分别表示神石的横坐标、纵坐标(−109≤ 横坐标、纵坐标 <109)。

输出格式:

在一行中输出神坛的最小面积,四舍五入保留 3 位小数。

答案

import java.util.Arrays;
import java.util.Scanner;
public class Main {
    static class Node {
        long x, y;
        int rel;
        Node(long x, long y) {
            this.x = x;
            this.y = y;
        }
    }
    static int n;
    static Node[] a;
    static Node[] b;
    static boolean cmp(Node x, Node y) {
        if (x.rel != y.rel) {
            return x.rel < y.rel;
        }
        return x.x * y.y - x.y * y.x > 0;
    }
    static int judge(Node x) {
        if (x.x > 0 && x.y > 0) return 1;
        if (x.x > 0 && x.y < 0) return 2;
        if (x.x < 0 && x.y < 0) return 3;
        if (x.x < 0 && x.y > 0) return 4;
        return 0;
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        a = new Node[n + 1];
        b = new Node[n + 1];
        for (int i = 1; i <= n; i++) {
            a[i] = new Node(scanner.nextLong(), scanner.nextLong());
        }
        double ans = -1;
        int cnt;
        for (int i = 1; i <= n; i++) {
            cnt = 1;
            for (int j = 1; j <= n; j++) {
                if (i == j) {
                    continue;
                }
                b[cnt] = new Node(a[j].x - a[i].x, a[j].y - a[i].y);
                b[cnt].rel = judge(b[cnt]);
                cnt++;
            }
            Arrays.sort(b, 1, n, Main::cmp);
            for (int j = 1; j < n - 1; j++) {
                if (ans == -1 || Math.abs(b[j + 1].x * b[j].y - b[j + 1].y * b[j].x) * 0.5 < ans) {
                    ans = Math.abs(b[j + 1].x * b[j].y - b[j + 1].y * b[j].x) * 0.5;
                }
            }
        }
        System.out.printf("%.3f\n", ans);
    }
}
相关文章
|
Java 编译器 Linux
学妹学Java(一)
学妹学Java(一)
113 0
|
2月前
|
存储 Java 程序员
Java灵魂拷问13个为什么,你都会哪些?
【11月更文挑战第6天】本文回答了一些常见的 Java“灵魂拷问”,包括 Java 跨平台的原因、垃圾回收机制的作用、接口不能有实例变量的原因、字符串不可变的好处、异常处理机制的意义、类加载机制的双亲委派模型、多线程同步机制的重要性、重写方法访问修饰符的限制、包装类的存在意义、`equals()` 和 `hashCode()` 方法一起重写的原因、静态方法不能被重写的原因、`ArrayList` 扩容策略的权衡,以及 `final` 关键字的多种用途。
|
7月前
|
Java 程序员
老程序员分享:Java基础
老程序员分享:Java基础
33 0
|
8月前
|
人工智能 Java 物联网
Java未来发展前景
【4月更文挑战第13天】Java未来发展前景
150 8
|
8月前
|
移动开发 Cloud Native Java
java进化史
Java进化史见证了编程语言从诞生到成熟的整个过程,以及其在全球范围内的广泛应用。从1995年Java语言首次发布至今,Java已经走过了二十多年的历程,期间经历了数次重要的版本更新和技术变革。本文将回顾Java的进化历程,分析关键版本的特点与影响,并探讨Java未来的发展趋势。
|
机器学习/深度学习 人工智能 安全
Java 在生活中的 10 大应用
Java 在生活中的 10 大应用
280 0
|
机器学习/深度学习 人工智能 分布式计算
迈入Java,一文告诉你为什么要学它!
Java是一种流行的编程语言,。自那时以来,Java已成为全球最广泛使用的编程语言之一。Java具有许多优点,包括跨平台、面向对象和安全性等,使其成为开发企业软件、Web应用程序和移动应用程序等领域的理想选择。
迈入Java,一文告诉你为什么要学它!
|
机器学习/深度学习 人工智能 Cloud Native
进击的 Java !
Java 的发展何去何从?
|
Kubernetes Oracle Java
2022 年 Java 将何去何从?
自从我们在《2020 年 Java 将何去何从》(Where's Java Going In 2020)中深度探讨 Java 生态系统以来,已经有一段时间了。JRebel 最新发布的《2022 年 Java 发展趋势和分析》报告(Java Development Trends and Analysis 2022)为我们提供了一个契机,可以重新审视 Java 生态系统。那么,根据 JRebel 的报告,这篇《2022 年的 Java 将何去何从》便出炉了。
1473 0
2022 年 Java 将何去何从?