数学(Python)

幂次进近

https://www.nowcoder.com/practice/1eda6676a6e544838263d8de9a8f3eed

思路:数学题,主要是精度和特判。第一个特判就是,此时令得到结果为0,这就是最小了;第二个特判就不好想了,当时,我们直接输出1即可,为什么?因为当时,对于来说,会超过题目的,并且差距会越来越大,所以说为了得到最小的结果,m只能取1

然后就可以直接算根了,为什么?因为题目给的是先减后增的,我们也可以在desmos里画图看一下。算出根之后,为了保证精度,我们取为半径,得到,然后算邻域范围内,能够取到最小函数值的自变量x,那就是答案了。

最后还是那个道理,对于多测来说要用一个out数组来记录所有答案,然后再一次print输出,会更快,因为python的print很花时间

代码:

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 GMI():
    return map(lambda x: int(x) - 1, 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))

'''

'''

out = []

def solve():
    n, k = MII()

    if k == 1: # 特判1
        out.append(str(n))
        return

    if k > 60: # 超绝特判2
        out.append('1')
        return

    # 直接算根,然后在[left, right]中找ans
    mid = int(pow(n, 1 / k))
    left = fmax(1, mid - 5)
    right = mid + 5

    ans = 0
    mn = inf
    for x in range(left, right):
        l, r = x, x + 1
        l_val, r_val = abs(n - pow(l, k)), abs(n - pow(r, k))
        
        diff = l_val - r_val
        if diff < 0 and l_val < mn:
            ans = l
            mn = l_val
        elif diff > 0 and r_val < mn:
            ans = r
            mn = r_val

    out.append(str(ans))

# t = 1
t = II()
for _ in range(t):
    solve()

print('\n'.join(out))
#每日一题挑战#
全部评论

相关推荐

01-19 15:14
已编辑
延安大学 C++
累死的一条狗:我说白了这种玩意你直接点举报就完事了在给他挂出来
找工作以来,你最看不惯_...
点赞 评论 收藏
分享
2025-12-21 21:22
安徽农业大学 运营
程序员花海:实习和校招简历正确格式应该是教育背景+实习+项目经历+个人评价 其中项目经历注意要体现业务 实习经历里面的业务更是要自圆其说 简历模板尽可能保持干净整洁 不要太花哨的
实习简历求拷打
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务