三角形面积:
题目描述
平面直角坐标系中有一个三角形, 请你求出它的面积。
输入描述
第一行输入一个 TT ,代表测试数据量
每组测试数据输入有三行,每行一个实数坐标 (x, y)(x,y) 代表三角形三个顶点。
1≤T≤10^3,−10^5≤x,y≤10^5
输出描述
输出一个实数表示三角形面积。结果保留2位小数,误差不超过 10^{-2}10−2
输入输出样例
示例 1
输入
2 0 1 1 0 1 1 0 0 1 1 2 2
输出
0.50 0.00
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
思路:
我们这里介绍一个计算三角形面积的公式,海伦公式介绍
公式表述
假设在平面内,有一个三角形,边长分别为a、b、c,三角形的面积S可由以下公式求得:
S=√p(p-a)(p-b)(p-c)
而公式里的p为半周长(周长的一半):
p=(a+b+c)/2
题目中给了我们三角形的三个点的坐标,我们可以通过勾股定理计算各个边的长度,在带入海伦公式计算即可
由于本题要求高精度,python浮点数是64位的,存在误差,大致理解思路即可
代码:
from math import*
def Dist(x1,x2,y1,y2):
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
t = int(input())
for i in range(t):
x1,y1=map(float,input().split())
x2,y2=map(float,input().split())
x3,y3=map(float,input().split())
a=Dist(x1, x2, y1, y2)
b=Dist(x3, x2, y3, y2)
c=Dist(x1, x3, y1, y3)
p=(a+b+c)/2
s=sqrt(p*(p-a)*(p-b)*(p-c))
print("{:.2f}".format(s))
平面切分
【问题描述】
平面上有 N 条直线,其中第 i 条直线是 y = Ai · x + Bi。
请计算这些直线将平面分成了几个部分。
【输入格式】
第一行包含一个整数 N。
以下 N 行,每行包含两个整数 Ai, Bi。
【输出格式】
一个整数代表答案。
【样例输入】
3
1 1
2 2
3 3
【样例输出】
6
【评测用例规模与约定】
对于 50% 的评测用例,1 ≤ N ≤ 4, 10 ≤ Ai, Bi ≤ 10。
对于所有评测用例,1 ≤ N ≤ 1000, 100000 ≤ Ai, Bi ≤ 100000。
思路
我们先读取数据n,再将每组线存入元组列表当中,使用set()来对重复的线段进行去重。
之后遍历所有的线段,并将当前线段与它之前的线段的交点找出来,存到set()创建的无序不重复元素集p中,确保每个交点都是不同的。
我们为什么要寻找线与线之间的交点呢?因为我们发现,每增加一条线,如果它和之前的线有n个交点,那么总的分割的区域就要增加n+1个。这也体现在我们的代码中
代码
n=eval(input())
line=[tuple(map(int,input().split())) for i in range(n)]
s=set(line)
line=list(s)
ans=2
for i in range(1,len(line)):
a1,b1=line[i]
pos=set()
for j in range(i):
a2,b2=line[j]
if a1==a2:
continue
x=(b1-b2)/(a1-a2)
y=a1*x+b1
pos.add((x,y))
ans+=len(pos)+1
print(ans)