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

小红的字符串

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


前言

alt


题解

补题这场比赛,好像还是难。


A. 小红的字符串

签到题

枚举最终的字符,求最小的修改

这个方法更有通用性

s = input()

from math import inf
import string

ans = inf
for c in string.ascii_letters:
    ans = min(ans, sum([1 for z in s if z != c]))
    
print (ans)

B. 小红的序列乘积

思路: 模拟

也是为后续的E题做铺垫

因为关注的个位数,所以乘积的时候,可以, 从而避免大数乘法

n = int(input())

arr = list(map(int, input().split()))

ans = 0
acc = 1
for v in arr:
    acc = acc * v % 10
    if acc == 6:
        ans += 1
print (ans)

C. 小红的数组重排

思路: 贪心构造

移项转化,可以观察到

偶数项

奇数项

两个序列大小没有制约关系

由于是严格小于,所以序列中必然没有3个以上的相同项

注:特别注意0最多一个,而且只能在偶数序列中

  1. 先分配出现次数为2的数,偶数/奇数序列各一个
  2. 0这个数一定要放在偶数序列中
  3. 剩下单个数,那个序列数不足,放哪里

# a1 < a3 < a5
# a2 < a4 < a6

n = int(input())
arr = list(map(int, input().split()))

from collections import Counter

def solve():
    m1 = (n + 1) // 2
    m2 = n // 2
    ext = []
    ls1, ls2 = [], []
    cnt = Counter(arr)
    if cnt[0] >= 2:
        return None
    for (k, v) in cnt.items():
        if v > 2:
            return None
        if v == 2:
            ls1.append(k)
            ls2.append(k)
        else:
            if k == 0:
                ls1.append(0)
            else:
                ext.append(k)
    while len(ls1) < m1:
        ls1.append(ext.pop())
    while len(ls2) < m2:
        ls2.append(ext.pop())
    # 排序组合
    ls1.sort()
    ls2.sort()
    res = []
    for (k1, k2) in zip(ls1, ls2):
        res.append(k1)
        res.append(k2)
    return res
    
ls = solve()
if ls is None:
    print ("NO")
else:
    print ("YES")
    print (*ls, sep=' ')


D. 虫洞操纵者

思路: BFS

有些绕,遇到1或者边界会存在跳跃情况



n = int(input())

g = []
for _ in range(n):
    row = list(map(int, input().split()))
    g.append(row)
    
from math import inf
dp = [[inf] * n for _ in range(n)]

from collections import deque
dp[0][0] = 0
deq = deque()
deq.append((0, 0))

while len(deq) > 0:
    y, x = deq.popleft()
    for (dy, dx) in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
        ty, tx = y + dy, x + dx
        if 0 <= ty < n and 0 <= tx < n:
            if g[ty][tx] == 0:
                if dp[ty][tx] > dp[y][x] + 1:
                    dp[ty][tx] = dp[y][x] + 1
                    deq.append((ty, tx))
                continue
        if dy == -1:
            ty += 2
            while ty < n and g[ty][tx] == 0:
                ty += 1
            if g[ty - 1][tx] == 0 and dp[ty - 1][tx] > dp[y][x] + 1:
                dp[ty - 1][tx] = dp[y][x] + 1
                deq.append((ty - 1, tx))
        elif dy == 1:
            ty -= 2
            while ty >= 0 and g[ty][tx] == 0:
                ty -= 1
            if g[ty + 1][tx] == 0 and dp[ty + 1][tx] > dp[y][x] + 1:
                dp[ty + 1][tx] = dp[y][x] + 1
                deq.append((ty + 1, tx))
        elif dx == -1:
            tx += 2
            while tx < n and g[ty][tx] == 0:
                tx += 1
            if g[ty][tx - 1] == 0 and dp[ty][tx - 1] > dp[y][x] + 1:
                dp[ty][tx - 1] = dp[y][x] + 1
                deq.append((ty, tx - 1))
        elif dx == 1:
            tx -= 2
            while tx >= 0 and g[ty][tx] == 0:
                tx -= 1
            if g[ty][tx + 1] == 0 and dp[ty][tx + 1] > dp[y][x] + 1:
                dp[ty][tx + 1] = dp[y][x] + 1
                deq.append((ty, tx + 1))
                
#print (dp)
print (dp[-1][-1] if dp[-1][-1] != inf else -1)

E. 小红的序列乘积2.0

思路: 贡献法 + DP

非常好的一道题

引入, 表示前i项中,个位数为s的序列总数

那为何引入贡献法呢?

其实只要出现6,那它就贡献 次数

那这个dp,只需要维护序列总数即可

第一维,可以借助滚动数组优化

这样时间复杂度为, 空间复杂度为

def pow(b, v, m):
    r = 1
    while v > 0:
        if v % 2 == 1:
            r = r * b % m
        b = b * b % m
        v //= 2
    return r    

n = int(input())

arr = list(map(int, input().split()))

dp = [0] * 10

mod = 10 ** 9 + 7
res = 0
for (i, v) in enumerate(arr):
    dp2 = dp[:]
    if v % 10 == 6:
        res += pow(2, (n - 1 - i), mod)
        res %= mod
    dp2[v % 10] += 1
    lv = v % 10;
    for j in range(1, 10):
        if j * lv % 10 == 6:
            res += dp[j] * pow(2, (n - 1 - i), mod) % mod
            res %= mod
        dp2[j * lv % 10] += dp[j]
        dp2[j * lv % 10] %= mod
    dp = dp2

print (res)

F. 灯下定影

下次补上



写在最后

alt

全部评论

相关推荐

避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
04-29 18:07
常州大学 Java
寂静羽翼:兄弟我已经亲身经历了,双非没实习很多大厂还是会给笔试的,可是有的公司笔试做的好也不给面一直卡着,ssob基本看我没实习都拒绝我了,但是每天投满偶尔也能有一两场初创公司的面试,但是薪资基本在五六千
点赞 评论 收藏
分享
评论
11
1
分享

创作者周榜

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