根据其他同学的提示和启发,修改了寻找三条边的判断逻辑。
但是仍然存在两个问题:
1.提交不通过,使用自测数据和C++版的比对,结果是一样的,怀疑可能是系统问题。
2.因为第一条的原因,使用input()逐行读取是否会导致超时的问题也无法验证。我看C++版的好像也是逐行读取,运行也很快。(题目特意提醒了较快的读取方式,我试了一下sys.stdin,但是没有成功。)
末尾附上自测数据的生成方法。
代码仅供参考,欢迎后面的同学指正。
import math
from collections import defaultdict
def calculate_area(a, b): # 腰,底
# 使用海伦公式计算三角形面积: s = (a + b + c) / 2
# math.sqrt(s * (s - a) * (s - b) * (s - c))
area = math.sqrt(a ** 2 - b ** 2 / 4) * b / 2 # c = a,化简一下公式
return round(area, 10)
def solve(num): # num是降序的
lst1 = [] # 数量为1的棍子,降序
lst2 = [] # 数量大于等于2的棍子,降序
for each in num:
if each[1] >= 2:
lst2.append(each)
else:
lst1.append(each)
if not lst2: # lst2为空,不存在等腰三角形
return 0, 0
if lst2[0][1] >= 3:
return lst2[0][0], lst2[0][0] # 腰,底
else: # 寻找底边
if len(lst2) == 1: # lst2只有1种棍子
if not lst1: # lst1为空
return 0, 0
while lst1: # lst1不为空,底边来自lst1,遍历lst1,判断是否构成三角形
if lst2[0][0] * 2 > lst1[0][0]:
return lst2[0][0], lst1[0][0]
lst1.pop(0) # 弹出lst1第一个元素
return 0, 0 # lst1中找不到可以构成三角形的
else: # lst2至少有2种棍子
if not lst1: # lst1为空,底边来自lst2,且必然能构成三角形
return lst2[0][0], lst2[1][0]
else: # lst1不为空,底边可能来自lst1或lst2,如果来自lst1,要判断是否构成三角形
db1 = lst2[1][0]
db2 = 0
while lst1: # lst1不为空,底边来自lst1,遍历lst1,判断是否构成三角形
if lst2[0][0] * 2 > lst1[0][0]:
db2 = lst1[0][0]
break
lst1.pop(0) # 弹出lst1第一个元素
return lst2[0][0], max(db1, db2)
while True:
try:
T = int(input())
res = []
for _ in range(T):
n = int(input())
temp = defaultdict(int) # defaultdict() 生成一个带默认值的字典
# 如果要查找的键不在字典中,不会抛出异常,而是会调用括号内的函数生成一个默认值
for _ in range(n):
length, cnt = map(int, input().split())
temp[length] += cnt
lst = sorted(temp.items(), key=lambda x: x[0], reverse=True)
res.append(lst)
for i in res:
a, b = solve(i)
if a != 0:
print(calculate_area(a, b))
else:
print(-1)
except:
break
# 生成测试数据
import random
with open('D:\Document\HJ112_data.txt', 'w') as f: # 路径改成自己的本地路径
T = random.randint(10, 20)
f.write(f'{T}\n')
for _ in range(T):
n = random.randint(1, 500)
f.write(f'{n}\n')
for _ in range(n):
l = random.randint(1, 500)
a = random.randint(1, 500)
f.write(f'{l} {a}\n')

京公网安备 11010502036488号