牛客周赛 Round 50 解题报告 | 珂学家

小红的最小最大

https://ac.nowcoder.com/acm/contest/85687/A


前言

alt


题解

数学场,对数学头痛, T_T.


A. 小红的最小最大

题型: 签到

a, b, x = list(map(int, input().split()))

if min(a, b) + x > max(a, b):
    print ("YES")
else:
    print ("NO")

B. 小红的四则运算(easy)

思路: 贪心

其实就3种情况

  • 三数之和
  • 两数之和 * 最大数
  • 三数相乘
arr = list(map(int, input().split()))

arr.sort()
r1 = arr[0] + arr[1] + arr[2]
r2 = (arr[0] + arr[1]) * arr[2]
r3 = arr[0] * arr[1] * arr[2]

print (max(r1, r2, r3))

C. 小红的四则运算(hard)

因为只有3个数,可以枚举操作顺序

  • 第一个和第二个数先操作,然后和第三个操作
  • 第二个和第三个数先操作,然后和第一个操作
a, b, c = list(map(int, input().split()))

v1 = max(a+b, a * b)
r1 = max(v1 + c, v1 * c)

v2 = max(b + c, b * c)
r2 = max(a + v2, a * v2)

print (max(r1, r2))

D. 小红的因式分解

思路: 解方程

其实就是一元二次解方程

alt

先要判定是否存在解

需要保证

难点在于转化为整数形态

可以从整除关系出发,即每个解的最简分母出发,通过gcd演化得到

需要保证 , 即d1*d2被a整除,就有整数解

t = int(input())

from math import gcd, sqrt

def solve():
    a, b, c = list(map(int, input().split()))
    # c = b1 * b2
    # b = a1 * b2 + a2 * b1
    # a = a1 * a2
    
    # -b +- sqrt(b^2 - 4ac)  / 2a
    if a == 0:
        return "%d %d %d %d" % (b, c, 0, 1)
    
    if b * b - 4 * a * c < 0:
        return "NO"
    z = b * b - 4 * a * c
    zr = int(sqrt(z))
    if zr * zr != z:
        return "NO"
    
    g1 = gcd(abs(-b + zr), abs(2 * a))
    g2 = gcd(abs(-b - zr), abs(2 * a))
    
    l1 = abs(2 * a) // g1
    l2 = abs(2 * a) // g2
    if abs(a) % (l1 * l2) != 0:
        return ("NO")
    
    x1 = (-b + zr) * l1 // (2 * a)
    x2 = (-b - zr) * l2 // (2 * a)
    
    l3 = a // (l1 * l2)
    
    return "%d %d %d %d" % (l1 * l3, -x1 * l3, l2, -x2)
    
for _ in range(t):
    print (solve())

E. 小红的树上移动

思路: 期望DP

期望题,核心就一句话

期望公式:

其本质是自底向上的DP

但是这个很特殊,它是分层的

所以这边采用分层BFS,然后逆序来实现

n = int(input())
g = [[] for _ in range(n)]

for _ in range(n - 1):
    u, v = list(map(int, input().split()))
    u, v = u - 1, v - 1
    g[u].append(v)
    g[v].append(u)
    

from collections import deque
from math import inf

e = [0] * n
h = [inf] * n
cs = [0] * n  # 子节点个数

layers = []

deq = deque()
h[0] = 0
deq.append(0)

# 分层bfs
while len(deq) > 0:
    tmp = []
    sz = len(deq)
    for i in range(sz):
        u = deq.popleft()
        for v in g[u]:
            if h[v] > h[u] + 1:
                h[v] = h[u] + 1
                deq.append(v)
                cs[u] += 1
        tmp.append(u)
    layers.append(tmp)
    
# 逆序求得期望
mod = 998244353
preE, preN = 0, 0
depth = len(layers)
for i in range(depth - 1, -1, -1):
    l = layers[i]
    for v in l:
        if cs[v] == 0:
            # 叶子节点为终结点,期望为0
            e[v] = 0
        else:
            # 非叶子节点,其期望由下一层的节点决定 
            e[v] = (preE + preN) * pow(preN, mod - 2, mod) % mod
    preE = sum([e[v] for v in l]) % mod
    preN = len(l)
    
print (e[0])

F. 小红的网格

后期补上

直觉感觉,需要枚举平方数,以及可行解边长的GCD有一定关系

t = int(input())

from math import gcd
def solve(x):
    i = 0
    g = 0
    d = 2
    while i * i <= x:
        y = x - i * i
        r = int(y ** 0.5)
        if r * r == y:
            g = gcd(g, i)
            g = gcd(g, r)
            if (i // g + r // g) % 2 == 1:
                d = 1
        i += 1
    if g == 0:
        return "inf"
    else:
        return d * g * g
        
for _ in range(t):
    x = int(input())
    print (solve(x))

写在最后

alt

全部评论
姐,能讲下e题的dp方程是个什么意思吗(求求了)
1 回复 分享
发布于 07-09 02:13 北京

相关推荐

去B座二楼砸水泥地:不过也可以理解,这种应该没参加过秋招
点赞 评论 收藏
分享
7 1 评论
分享
牛客网
牛客企业服务