题解 | #C~E#

小红的子序列求和

https://ac.nowcoder.com/acm/contest/80743/E

C 小红的素数合并

首先将数组排序,如果数组长度为奇数则最大项不参与合并,其余的贪心地让第i小的项与第i大的项合并即可,合并过程中更新最大最小值。

import sys, random
INF = float('inf')
input = lambda: sys.stdin.readline().rstrip("\r\n")
ii = lambda: int(input())
lmii = lambda: list(map(int, input().split()))

n = ii()
a = sorted(lmii())
mx, mn = 0, INF
if len(a) & 1:
    mn = mx = a.pop()
    n -= 1
    
for i in range(n // 2):
    cur = a[i] * a[n - i - 1]
    mn = min(mn, cur)
    mx = max(mx, cur)
print(mx - mn)

D 小红的树上删边

从叶子节点向根节点计算子树大小,因为要删尽可能多的边,所以一旦发现偶数大小的子树立刻删掉该子树的根与其父亲节点的边,将该子树大小更新为零。如果最后根节点的字数大小为奇数,说明无法实现。

import sys, random
from types import GeneratorType
input = lambda: sys.stdin.readline().rstrip("\r\n")
ii = lambda: int(input())
mii = lambda: map(int, input().split())

def bootstrap(f, stack=[]):  
    def wrappedfunc(*args, **kwargs):
        if stack:
            return f(*args, **kwargs)
        else:
            to = f(*args, **kwargs)
            while True:
                if type(to) is GeneratorType:
                    stack.append(to)
                    to = next(to)
                else:
                    stack.pop()
                    if not stack:
                        break
                    to = stack[-1].send(to)
            return to
    return wrappedfunc

n = ii()
g = [[] for _ in range(n + 1)]
for _ in range(n - 1):
    u, v = mii()
    g[u].append(v)
    g[v].append(u)

sz = [-1] * (n + 1)
ans = 0
@bootstrap
def dfs(u, p):
    global ans
    for v in g[u]:
        if v == p: continue
        if sz[v] == -1: yield dfs(v, u)
        sz[u] += sz[v]
    if sz[u] % 2 == 0:
        if u != 1: 
            ans += 1
            sz[u] = 0
    else:
        if u == 1:
            ans = -1
    yield None

dfs(1, -1)
print(ans)
 

E 小红的子序列求和

注意到n和k很小,可以O(n^2),于是dp

表示遍历至第i个数时长度为j的数的和

@表示+

import sys, random
input = lambda: sys.stdin.readline().rstrip("\r\n")
mii = lambda: map(int, input().split())
lmii = lambda: list(map(int, input().split()))
mod = int(1e9 + 7)

n, k = mii()
a = [0] + list(map(int, list(input())))
dp = [[0] * (n + 1) for _ in range(n + 1)]
C = [[0] * 1001 for _ in range(1001)]
for i in range(n + 1):
    C[i][0] = 1
for i in range(1, n + 1):
    for j in range(1, i + 1):
        C[i][j] = C[i - 1][j] + C[i - 1][j - 1]

for i in range(1, n + 1):
    for j in range(1, i + 1):
        dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1] * 10 + a[i] * C[i - 1][j - 1]
        dp[i][j] %= mod

print(dp[n][k])
        

全部评论

相关推荐

06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

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