题解 | #牛客周赛 Round 46#

祥子拆团

https://ac.nowcoder.com/acm/contest/84444/F

A 乐奈吃冰

。。。

a,b = map(int,input().strip().split())
print(a + min(a // 2,b))

B 素世喝茶

。。。

n,x = map(int,input().strip().split())
a = list(map(int,input().strip().split()))
x -= 1
t_max = a[0]
t = 0
for i,num in enumerate(a):
    if i == x:
        continue
        
    if num == t_max:
        t += 1
    elif num > t_max:
        t_max = num
        t = 1
print(t)

C 爱音开灯

获取x的所有因数,判断有多少个因数在[1,n]范围内,若在范围内则会被开/关灯一次

n,x = map(int,input().strip().split())

if x == 1:
    t = 1
else:
    d = 2
    t = 0
    if 1 <= n:
        t += 1
    
    if x <= n:
        t += 1
        
    while d * d <= x:
        if x % d == 0:
            if d <= n:
                t += 1
                
            if d * d != x:
                if x // d <= n:
                    t += 1
        d += 1


if t&1:
    print("ON")
else:
    print("OFF")
    

D 小灯做题

分情况讨论,详情见代码。。。

T = int(input())
for _ in range(T):
    a,b,c,k = map(int,input().strip().split())
    arr = [a,b,c]
    if k in arr:
        print(0)
    elif not k:
        print(1)
    elif k == 2:
        if 0 in arr and 1 in arr:
            print(1)
        elif 0 in arr and 1 not in arr:
            print(2)
        elif 0 not in arr and 1 in arr:
            print(2)
        else:
            print(3)
    elif k == 1:
        if 0 in arr:
            print(1)
        else:
            print(2)
    else:
        print(-1)

E 立希喂猫

排序

按每种猫粮的数目从小到大进行排序

二分搜索

根据天数k值,对排序后的数组进行二分搜索得到pospos左边的猫粮会被全部吃完,pos右边的猫粮每一种都能吃k

简简单单前缀和

  • left 代表猫粮会被全部吃完的价值前缀和
  • right 代表猫粮会只被吃一次的价值前缀和
n = int(input())
A = list(map(int,input().strip().split()))
B = list(map(int,input().strip().split()))

arr = list(zip(B,A))

arr.sort()
# print(arr)

# 猫粮会被全部吃完的前缀和
left = [0] * (n+1)

# 每种只吃一次的前缀和
right = [0] * (n+1)
for i,(b,a) in enumerate(arr):
    left[i+1] = left[i] + a*b
    right[i+1] = right[i] + a

# print(left,right)

import bisect
q = int(input())
while q:
    k = int(input())
    # 二分搜索
    pos = bisect.bisect_right(arr,(k,int(1e10)))
    res = left[pos] + (right[-1] - right[pos]) * k
    print(res)
    
    q -= 1

F 祥子拆团

因数分解

x进行因数分解,因数分解不包含1,如8分解:

8 = 2 * 2 * 2
8 = 2 * 4
8 = 4 * 2
8 = 8

dfs即可:

# 因数分解
@lru_cache(None)
def dfs(num,i,y):
    if num == 1:
        return myComb(y,i)
    
    res = 0
    res += dfs(1,i+1,y)
    if i + 1 != y:
        d = 2
        while d * d <= num:
            if num % d == 0:
                res += dfs(d,i+1,y)
                if d * d != num:
                    res += dfs(num//d,i+1,y)
                res %= mod
            d += 1
    return res

当然要加个记忆化搜索。

组合数学

假设分解成i个数相乘,则其它空余位置补1,即C(y,i),逆元和组合数学解决

最终代码

呵呵,pypy3竟然没超时。

T = int(input())
mod = int(1e9+7)

# 预处理阶乘以及其逆元
max_n = int(2*1e5)
fac = [1] * (max_n+1)
facinv = [1] * (max_n+1)

for i in range(1,max_n+1):
    fac[i] = fac[i-1] * i % mod
    # python自带快速幂
    facinv[i] = pow(fac[i],mod-2,mod)

from functools import lru_cache
@lru_cache(None)
def myComb(n,m):    
    if m < 0 or n < m:
        return 0
    
    if n - m < m:
        m = n - m
    
    res = 1
    for i in range(m):
        res *= n-i
        res %= mod
        
    return res * facinv[m] % mod

# 因数分解
@lru_cache(None)
def dfs(num,i,y):
    if num == 1:
        return myComb(y,i)
    
    res = 0
    res += dfs(1,i+1,y)
    if i + 1 != y:
        d = 2
        while d * d <= num:
            if num % d == 0:
                res += dfs(d,i+1,y)
                if d * d != num:
                    res += dfs(num//d,i+1,y)
                res %= mod
            d += 1
    return res
    
for _ in range(T):
    x,y = map(int,input().strip().split())
    print(dfs(x,0,y))
全部评论

相关推荐

迟缓的马里奥求你们别...:我双2,FPGA方向,在成都找工作投了上百家,收到面试的不超过10家,是成都这个地方太有说法了。西南柬埔寨
秋招,不懂就问
点赞 评论 收藏
分享
bg双非本科,方向是嵌入式。这次秋招一共拿到了&nbsp;8&nbsp;个&nbsp;offer,最高年包&nbsp;40w,中间也有一段在海康的实习经历,还有几次国家级竞赛。写这篇不是想证明什么,只是想把自己走过的这条路,尽量讲清楚一点,给同样背景的人一个参考。一、我一开始也很迷茫刚决定走嵌入式的时候,其实并没有一个特别清晰的规划。网上的信息很零散,有人说一定要懂底层,有人说项目更重要,也有人建议直接转方向。很多时候都是在怀疑:1.自己这种背景到底有没有机会2.现在学的东西到底有没有用3.是不是已经开始晚了这些问题,我当时一个都没答案。二、现在回头看,我主要做对了这几件事第一,方向尽早确定,但不把自己锁死。我比较早就确定了嵌入式这个大方向,但具体做哪一块,是在项目、竞赛和实习中慢慢调整的,而不是一开始就给自己下结论。第二,用项目和竞赛去“证明能力”,而不是堆技术名词。我不会刻意追求学得多全面,而是确保自己参与的每个项目,都能讲清楚:我负责了什么、遇到了什么问题、最后是怎么解决的。第三,尽早接触真实的工程环境。在海康实习的那段时间,对我触动挺大的。我开始意识到,企业更看重的是代码结构、逻辑清晰度,以及你能不能把事情说清楚,而不只是会不会某个知识点。第四,把秋招当成一个需要长期迭代的过程。简历不是一次写完的,面试表现也不是一次就到位的。我会在每次面试后复盘哪些问题没答好,再针对性补。三、我踩过的一些坑现在看也挺典型的:1.一开始在底层细节上纠结太久,投入产出比不高2.做过项目,但前期不会总结,导致面试表达吃亏3.早期有点害怕面试,准备不充分就去投这些弯路走过之后,才慢慢找到节奏。四、给和我背景相似的人一点建议如果你也是双非,准备走嵌入式,我觉得有几件事挺重要的:1.不用等“准备得差不多了”再投2.项目一定要能讲清楚,而不是做完就算3.不要只盯着技术,多关注表达和逻辑很多时候,差的不是能力,而是呈现方式。五、写在最后这篇总结不是标准答案,只是我个人的一次复盘。后面我会陆续把自己在嵌入式学习、竞赛、实习和秋招中的一些真实经验拆开来讲,希望能对后来的人有点帮助。如果你正好也在这条路上,希望你能少走一点弯路。
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

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