三角形面积:
题目描述
平面直角坐标系中有一个三角形, 请你求出它的面积。
输入描述
第一行输入一个 TT ,代表测试数据量
每组测试数据输入有三行,每行一个实数坐标 (x, y)(x,y) 代表三角形三个顶点。
1≤T≤10^3,−10^5≤x,y≤10^5
输出描述
输出一个实数表示三角形面积。结果保留2位小数,误差不超过 10^{-2}10−2
输入输出样例
示例 1
输入
1. 2 2. 0 1 3. 1 0 4. 1 1 5. 0 0 6. 1 1 7. 2 2
输出
1. 0.50 2. 0.00
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
思路:
公式表述
海伦公式:
假设在平面内,有一个三角形,边长分别为a、b、c,三角形的面积S可由以下公式求得:
S=√p(p-a)(p-b)(p-c)
而公式里的p为半周长(周长的一半):
p=(a+b+c)/2
题目中给了我们三角形的三个点的坐标,我们可以通过勾股定理计算各个边的长度,在带入海伦公式计算即可
由于本题要求高精度,python浮点数是64位的,存在误差,大致理解思路即可
代码:
1. from math import* 2. 3. def Dist(x1,x2,y1,y2): 4. return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) 5. 6. t = int(input()) 7. for i in range(t): 8. x1,y1=map(float,input().split()) 9. x2,y2=map(float,input().split()) 10. x3,y3=map(float,input().split()) 11. a=Dist(x1, x2, y1, y2) 12. b=Dist(x3, x2, y3, y2) 13. c=Dist(x1, x3, y1, y3) 14. p=(a+b+c)/2 15. s=sqrt(p*(p-a)*(p-b)*(p-c)) 16. 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个。这也体现在我们的代码中
代码
1. n=eval(input()) 2. line=[tuple(map(int,input().split())) for i in range(n)] 3. s=set(line) 4. line=list(s) 5. ans=2 6. for i in range(1,len(line)): 7. a1,b1=line[i] 8. pos=set() 9. for j in range(i): 10. a2,b2=line[j] 11. if a1==a2: 12. continue 13. x=(b1-b2)/(a1-a2) 14. y=a1*x+b1 15. pos.add((x,y)) 16. ans+=len(pos)+1 17. print(ans)