蓝桥杯真题——三角形的面积

news/2024/11/13 3:30:39/

题目描述

平面直角坐标系中有一个三角形, 请你求出它的面积。

输入描述

第一行输入一个 T ,代表测试数据量.

每组测试数据输入有三行,每行一个实数坐标 (x,y) 代表三角形三个顶点。

1≤T≤10^3,   −10^5≤x,y≤10^5

输出描述

输出一个实数表示三角形面积。结果保留2位小数,误差不超过 10^(−2)

输入输出样例

示例 1

输入

2
0 1
1 0
1 1
0 0
1 1
2 2

输出

0.50
0.00

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

目录

前言

一、问题分析

二、计算技巧

三、代码

四、有缺点的示范

 总结


前言

        这是一道计算机几何基础题,难度为简单,但同样也会有很多人做错,绝大多数人的会存在的误区:

1. 使用传统的三角形面积求解公式:底*高/2

2. 使用向量,向量夹角求解

这样做的思路没错,但仅限于手工计算方便吧,使用计算机计算就会出现计算精度和误差的问题,从而导出输出结果错误。

对于数学能力比较好的人,掌握计算技巧,相信能很快就做出来了。


一、问题分析

一共有T个三角形,每个三角形都只知道三个顶点的坐标,需要分别计算各个三角形的面积并分行输出计算结果。

数据规模:T最大为10^3,坐标的范围为[-10^5,10^5],这个规模的数据可以放心计算,问题不大,完全可以很好的控制在1s内程序运行完成。

二、计算技巧

计算公式:

三个坐标点:(x1,y1),(x2,y2),(x3,y3)

面积 2S = Math.abs(x1y2+x2y3+x3y1-x1y3-x2y1-x3y2);

S = S/2

是否有印象?这是我能想到最简单和最有效的计算公式了,忘记的小伙伴可以去百度温习一下这公式


三、代码

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);int N = scan.nextInt();for(int i=0;i<N;i++){double x1 = scan.nextDouble();double y1 = scan.nextDouble();double x2 = scan.nextDouble();double y2 = scan.nextDouble();double x3 = scan.nextDouble();double y3 = scan.nextDouble();double S = Math.abs(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2);System.out.printf("%.2f",S/2);System.out.println();}scan.close();}
}

四、有缺点的示范

以下是一个输出结果不会完全正确的案例,计算方法和思路是没错的,你可以思考以下啥原因导致的部分错误,也就是部分用例可以运行通过。

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);//测试数据的组数int T = scan.nextInt();//3*T组三角形顶点的坐标  每三个坐标(x,y)为一个三角形int[][] a = new int[3*T][2];for(int i=0; i<3*T; i++){a[i][0] = scan.nextInt();a[i][1] = scan.nextInt();}scan.close();//求三角形的面积 底d*高h/2for(int i=0; i<3*T; i += 3){//知道三个顶点坐标,使用向量求解三角形面积S = 1/2*|AB|*|AC|*sinx//三个顶点  按顺序默认编号为A、B、Cdouble ABx = a[i+1][0] - a[i][0];double ABy = a[i+1][1] - a[i][1];double ACx = a[i+2][0] - a[i][0];double ACy = a[i+2][1] - a[i][1];double AB = Math.sqrt( (ABx*ABx + ABy*ABy));double AC = Math.sqrt((ACx*ACx + ACy*ACy));double cosx = (ABx*ACx + ABy*ACy)/(AB*AC);double sinx = Math.sqrt((1-cosx*cosx));double S = 0.50*AB*AC*sinx;System.out.printf("%.2f\n",S);}}
}

 总结

学习算法,对于数学学的好的人可以得心应手,逻辑思维能力很重要,掌握计算技巧,往往比暴力计算更有效和更省时


http://www.ppmy.cn/news/42731.html

相关文章

考试前临时抱佛脚有用吗?这篇复习攻略会告诉你答案

夏天来了&#xff0c;大家的期末考试也将不远了。不知平时大家是如何准备考试的&#xff0c;是平时学习计划有序进行复习&#xff0c;还是考试前临时抱佛脚呢&#xff1f;今天就来跟大家讲一讲&#xff0c;学习中很重要的一个环节&#xff0c;如何复习。所以敲黑板&#xff0c;…

Visual Studio Code 常见的配置、常用好用插件以及【vsCode 开发相应项目推荐安装的插件】

一、VsCode 常见的配置 1、取消更新 把插件的更新也一起取消了 2、设置编码为utf-8&#xff1a;默认就是了&#xff0c;不用设置了 3、设置常用的开发字体&#xff1a;Consolas, 默认就是了&#xff0c;不用设置了 字体对开发也很重要&#xff0c;不同字体&#xff0c;字母形…

(大数据开发随笔7)Hadoop 3.3.x分布式环境部署——伪分布式模式

伪分布式模式 前戏 jdk和hadoop环境变量配置 确保防火墙关闭&#xff1a;systemctl status firewalld &#xff1b;返回 inactive &#xff1b;关闭命令 systemctl stop firewalld &#xff1b;防止自启动命令 systemctl disable firewalld 报错&#xff1a;-bash: /usr/bin/…

代码随想录算法训练营day57|647.回文子串516.最长回文子序列 剑指offer39、66

647.回文子串 题目链接 本题主要是确定如何定义合适的dp数组&#xff0c;如果定义一维的数组不好找到递推关系&#xff0c;如果定义二维的&#xff0c;向两边拓展来判断回文子串是比较合适的&#xff0c;所以dp[i][j]表示[i,j]的子串是否是回文子串&#xff0c;注意这里是是否…

【Android -- 软技能】聊聊高效开发的一些套路与实践

前言 在开发中&#xff0c;编码我们有分层架构、设计模式做为套路来高效开发&#xff0c;但你也知道编码不是开发的全部&#xff0c;一个完全的开发流程用面向对象思想来概括&#xff0c;它分为OOA&#xff08;面向对象分析&#xff09;、OOD&#xff08;面向对象设计&#xf…

梦中情树---二叉树

前言&#xff1a; 今天就来讲树的一种特殊结构---二叉树 当然先来给大家看一张图片 看到这棵树了吗&#xff1f;它从根开始&#xff0c;每个结点都有且仅有两个分支&#xff0c;这个结构就是我们的二叉树。 其实我们上次讲的堆也可以看成一棵二叉树&#xff0c;但是人家的本质…

联想集团ESG与社会价值论坛召开,首次发布《联想集团2022社会价值报告》

对企业而言&#xff0c;ESG不再是选择题&#xff0c;而是必答题。 联想集团是ESG的先行者、领军者。 2023年4月11日&#xff0c;“联想集团ESG与社会价值论坛暨《联想集团2022社会价值报告》发布会”在京召开&#xff0c;会议由中国社会责任百人论坛、联想集团联合主办&#xf…

mysql 建表约束

主键约束 -- 主键约束 -- 使某个字段不重复且不得为空&#xff0c;确保表内所有数据的唯一性。 CREATE TABLE user (id INT PRIMARY KEY,name VARCHAR(20) );-- 联合主键 -- 联合主键中的每个字段都不能为空&#xff0c;并且加起来不能和已设置的联合主键重复。 CREATE TABLE …