题解 | #序列和#

https://www.nowcoder.com/practice/46eb436eb6564a62b9f972160e1699c9

target, n = map(int, input().split())
k = n
i = (target - k*(k-1)//2)//k
if i<0:
    i=0
j = n + i - 1

res = n
ans = []
while True:
    if k>100:
        print('No')
        break
    total = (i+j)*k/2
    if total == target:
        for x in range(k):
            ans.append(i)
            i+=1
        print(' '.join(map(str, ans)))
        break
    elif total < target:
        i+=1
        j+=1
    elif total>target:
        k += 1
        i = (target - k*(k-1)//2)//k
        if i<0:
            i=0
        j = k + i - 1

第一次使用ACM模式,所以输入输出写的不是很优雅,还望见谅
算法的思路就是,从目标的长度和L作为初始的滑动窗口长度,开始滑动,从[0,0+L-1]开始,使用等差数列求和计算totai与目标和N比较,小则移动,大则退出,尝试L+1长度的滑动窗口,因为提的目的是找>=L的最小长度的,所以从L出发,若是有那就可以节省很大的计算量,但是当遇到N很大的情况,该算***超时
于是,优化:i的初始值从0优化至(N-k(k-1)//2)//k,其中k则是滑动窗口的长度,初始值为L,每次循环+1,并约束i>0,若是负数,则直接赋给0,即回到优化前的算法

全部评论

相关推荐

暴杀流调参工作者:春招又试了一些岗位,现在投递很有意思,不仅要精心准备简历,投递官网还得把自己写的东西一条一条复制上去,阿里更是各个bu都有自己的官网,重复操作无数次,投完简历卡完学历了,又该写性格测评、能力测评,写完了又要写专业笔试,最近还有些公司搞了AI辅助编程笔试,有些还有AI面试,对着机器人话也听不明白录屏硬说,终于到了人工面试又要一二三四面,小组成员面主管面部门主管面hr面,次次都没出错机会,稍有不慎就是挂。 卡学历卡项目卡论文卡实习什么都卡,没有不卡的😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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