题解 | #置换操作#

置换操作

https://ac.nowcoder.com/acm/contest/84773/C

C题讨论合并的段是否相邻即可
from itertools import accumulate

def f(x):
    return (x+1)*x >> 1

def main():
    n = int(input())
    s = list(map(len,input().split("0"))); m = len(s)
    if m < 3: return print(f(n))
    t = [0]; t.extend(accumulate(s))
    r = [0]; r.extend(accumulate(map(f,s)))
    ans = r[-1]+max(f(t[i+3]-t[i]+2)-(r[i+3]-r[i]) for i in range(m-2))
    gap = [f(t[i+2]-t[i]+1)-(r[i+2]-r[i]) for i in range(m-1)]
    ans = max(ans,r[-1]+max(x+y for x,y in zip(accumulate(gap,max),gap[2:])))
    print(ans)
    
main()


全部评论

相关推荐

zaakfung:26届不应该春招吗 为啥还实习
点赞 评论 收藏
分享
03-03 23:12
已编辑
北京邮电大学 Java
书海为家:我来给一点点小建议,因为毕竟还在学校不像工作几年的老鸟有丰富的项目经验,面试官在面试在校生的时候更关注咱们同学的做事逻辑和思路,所以最好在简历中描述下自己做过项目的完整过程,比如需求怎么来的,你对需求的解读,你想到的解决办法,遇到困难如何找人求助,最终项目做成了什么程度,你从中收获了哪些技能,你有什么感悟。
你的简历改到第几版了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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