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


前言

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

先要判定是否存在解

需要保证

b 2 − 4 a c ≥ 0 b^2 - 4ac \ge 0 b24ac0

难点在于转化为整数形态

可以从整除关系出发,即每个解 x 1 , x 2 {x_1,x_2} x1,x2的最简分母出发 d 1 , d 2 d_1, d_2 d1,d2,通过gcd演化得到

需要保证 d 1 ∗ d 2 ∣ a d1*d2|a d1d2∣a, 即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

期望题,核心就一句话

概率正推,期望倒推 概率正推,期望倒推 概率正推,期望倒推

期望公式:

e [ u ] = 1 / ∣ S ( h + 1 ) ∣ ∗ ( ∑ v ∈ S h + 1 e [ v ] ) + 1 e[u] = 1/|S(h+1)| * (\sum_{v\in S_{h+1}} e[v]) + 1 e[u]=1/∣S(h+1)(vSh+1e[v])+1

u 为 h 层节点 u为h层节点 uh层节点

v 为 h + 1 层节点 v为h+1层节点 vh+1层节点

∣ S ( h + 1 ) ∣ 为 h + 1 层的节点个数 |S(h+1)|为h+1层的节点个数 S(h+1)h+1层的节点个数

其本质是自底向上的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

相关推荐

  1. Round 50

    2024-07-10 02:06:07       35 阅读
  2. Round 51

    2024-07-10 02:06:07       19 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 02:06:07       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 02:06:07       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 02:06:07       57 阅读
  4. Python语言-面向对象

    2024-07-10 02:06:07       68 阅读

热门阅读

  1. ElasticSearch从入门到精通

    2024-07-10 02:06:07       17 阅读
  2. 重构功能带来的配套改造查找思路

    2024-07-10 02:06:07       21 阅读
  3. Go语言中的闭包函数:强大而灵活的编程工具

    2024-07-10 02:06:07       15 阅读
  4. React基础与核心概念探索

    2024-07-10 02:06:07       23 阅读
  5. 集训day3:并查集

    2024-07-10 02:06:07       22 阅读
  6. LeetCode --- 2103. Rings and Rods 解题报告

    2024-07-10 02:06:07       16 阅读
  7. 重定向(Redirect)和转发(Forward)

    2024-07-10 02:06:07       23 阅读
  8. Git:现代软件开发的基石

    2024-07-10 02:06:07       26 阅读
  9. uni-app-H5页面调用设备摄像头扫描二维码

    2024-07-10 02:06:07       24 阅读
  10. docker

    2024-07-10 02:06:07       19 阅读