牛客周赛 Round 39补题

 警钟长鸣,题目的名字和题目没有绝对关系😭

B-小红不想做鸽巢原理_牛客周赛 Round 39 (nowcoder.com)

鸽巢原理是类似于三个人进两间屋子,至少有一个屋子的人至少为两人这样,和这个好像关联也不是太大,可能我太笨没想到

求一下读入的数量的总数,对k取模,列表降序排列,从最大的数量开始判断 能取几堆球

不要忘记特判能全取光的情况

n, k = map(int, input().split())
li = list(map(int, input().split()))
li.sort(reverse=True)
t = sum(li) % k
ans = 0
if t == 0:
    print(0)
else:
    for i in li:
        ans += 1
        if i < t:
            t -= i
        else:
            break
    print(ans)

D-小红不想做完全背包 (hard)_牛客周赛 Round 39 (nowcoder.com)

对每个价值\ a_{i}mod \ p 是与 a_i 等价的,对列表取模做去重处理

把 选最少物品   抽象为  走最短路径,选最少物品就成了一个最短路问题 ,每次循环遍历整个列表,移动距离为a_i ,移动到的位置为(NowPos+a_i)mod \ p, 我们需要一个d数组存移动到[0,p-1]某个位置的最短距离

状态转移:d \ [ (NowPos+a_i) \ mod \ p ] = d[NowPos] + 1

值得注意的是,由于每次都会遍历整个列表,所以我们的bfs的队列是不会空的,所以bfs结束的条件是d_0 \ !=0

from collections import deque
n, p = map(int, input().split())
li = list(map(int, input().split()))
q = deque()
d = [0] * (p + 5)
for i in range(len(li)):
    li[i] %= p
li = set(li)
q.append(0)
while d[0] == 0:
   tmp = q.popleft()
   for i in li:
       np = (tmp+i) % p
       if d[np] == 0:
           d[np] = d[tmp] + 1
           q.append(np)
print(d[0])

E-小红不想做莫比乌斯反演杜教筛求因子和的前缀和_牛客周赛 Round 39 (nowcoder.com)

对方程  x = 2*i*k+2*j*k+i*j  变形得到  k = \frac{x-i*j }{2*(i+j)}

枚举 i ,j 的值, 判断 k 是否在范围内

警钟长鸣,千万不要三重循环。。。。

n, m, p, x = map(int, input().split())
ans = 0
for i in range(1, n + 1):
    for j in range(1, m + 1):
        fz = x - i * j
        fm = 2 * j + 2 * i
        if fz % fm == 0:
            t = fz // fm
            if 1 <= t <= p:
                ans += 1
print(ans)

后记

F说是个模拟,区间修改按理应该是线段树的,但是模拟了一下也过了

G以后有时间再说吧,晕了

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值