思路:浮点数三分。题目给定了单峰函数,并且每个单峰函数的相互独立。所以说我们每两个点之间算出一个单峰函数,之后再用浮点数三分把
给算出来,并且算出具体的函数值
,接着不断累加到ans中,最终输出答案即可
技巧:三分函数我们只需要写找最大值单峰的逻辑即可,然后用一个find_max变量来记录我们是否找的是最大值,如果是的话就为True,直接用我们写的找最大值单峰逻辑即可;否则为False,就意味着我们要三分的函数为最小值单峰函数,那就可以整体添加一个-号,把他变成最大值单峰函数,之后就可以复用找最大值单峰的逻辑了。最终,找到并输出最大值/最小值对应的自变量,以及最大值/最小值即可
代码:
import sys
input = lambda: sys.stdin.readline().strip()
import math
inf = 10 ** 18
def I():
return input()
def II():
return int(input())
def MII():
return map(int, input().split())
def LI():
return input().split()
def LII():
return list(map(int, input().split()))
def LFI():
return list(map(float, input().split()))
fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
isqrt = lambda x: int(math.sqrt(x))
'''
'''
def ternary_search(func, l, r, eps=1e-9, find_max=True):
f = func if find_max else lambda x: -func(x)
while r - l > eps:
m1 = l + (r - l) / 3
m2 = r - (r - l) / 3
f1, f2 = f(m1), f(m2)
if f1 < f2:
l = m1
else:
r = m2
mid = (l + r) / 2
return mid, func(mid)
def solve():
n = II()
def dis(x1, y1, x2, y2):
return math.sqrt(abs(x2 - x1) * abs(x2 - x1) + abs(y2 - y1) * abs(y2 - y1))
ans = 0
pre_x = pre_y = -1
for i in range(n):
x, y = LFI()
if i == 0:
pre_x, pre_y = x, y
continue
e = dis(pre_x, pre_y, x, y)
func = lambda k: 2 * k + 2 * e / (2 ** k)
ans += ternary_search(func, 0, 1e3, find_max=False)[1]
pre_x, pre_y = x, y
print(ans)
t = 1
# t = II()
for _ in range(t):
solve()

京公网安备 11010502036488号