根据其他同学的提示和启发,修改了寻找三条边的判断逻辑。
但是仍然存在两个问题:
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')