3.24拼多多算法笔试(pdd)

Q1

这里有n个正整数,a1,....,an

Alice 会先去掉其中最多d 个数

Bob 接下来会将剩余的数中最多m个数乘以 -k

Alice 想要剩余数之和尽可能大,Bob 想要剩余数之和尽可能小。假设 Alice 和 Bob 都足够聪明,请问最后剩余数之和是多少。

输入描述

第一行一个正整数T,接下来有T组数据

每组数据2行

第一行4 个数

n, m, k, d (2 ≤ n ≤ 10^5) (0 ≤ m, d ≤ n) (1 ≤ k < 10^4)

第二行n个数,a1,a2,..., an (1 ≤ ai ≤ 10^9)

保证sigma n不超过10^5

输出描述

每组数据输出一行,每行一个数,表示剩余数之和

A1

排序,滑动窗口解决,为啥有滑动窗口这个结论是因为有一个单调性:Alice和Bob都倾向选大端的数!

import sys

t = int(input())
for i in range(t):
    n,m,k,d = map(int,input().split())
    nums = list(map(int,input().split()))
    nums.sort(key=lambda x:-x)
    tmp = -k*sum(nums[:m])+sum(nums[m:])
    res = tmp
    for i,num in enumerate(nums):
        if i>=d:
            break
        tmp+=k*nums[i]
        tmp-=(k+1)*nums[i+m] if i+m<n else 0
        res = max(res,tmp)
    print(res)

Q2

伊文有两个由0和1组成的字符串,A和B,长度分别为m和n(m>=n)。伊文希望取出A的连续子串与B构造若干长度为n的S串,满足:

  • 

伊文想知道总共能够构造出多少个不同的S串。

输入描述

输入有三行,第一行2个数m和n,为A和B的长度;

m,n (0 <n≤m≤5 x10^3)

第二行为长度为m的A串

第三行为长度为 的B串,A和B仅由'0'和'1'组成

输出描述

输出:一个数字,代表不同的S串个数

A2

签到题在第二题,这个数据量级直接暴力了

import sys

m,n = map(int,input().split())
a = input()
b = input()

def xor(s1,s2):
    res = ""
    cnt = 0
    for a,b in zip(s1,s2):
        if (a=='1' and b=='0') or (b=='1' and a=='0'):
            res+='1'
            cnt^=1
        else:
            res+='0'
            cnt^=0
    return cnt,res

s = set()
for i in range(m-n+1):
    cnt,res = xor(a[i:i+n],b)
    if cnt:
        continue
    if res not in s:
        s.add(res)
print(len(s))

Q3

多多快递站共有n个快递点,n个快递点之间通过m条单向车道连接。快递员从任何一个快递站点出发,都无法通过单向车道回到该站点。也就是说,n个快递点组成一张有向无环图。对于快递点u,如果对于所有的快递点v(u != w),快递员都可以从w走到v,或者从v走到u,那么则评定站点u为超级快递点。

请你帮忙算一算,一共有多少个超级快递点。

输入描述

第一行2个数字n(2≤n≤3*10^5),m(1≤m ≤3*10^5),n为快递点个数,m为单向车道个数。

接下来的m行每行两个数字u,v (1<=u,v<=n,u!=v),表示有一条站点么指向0的单向车道。

输出描述

请输出1个数字,表示超级快递点的个数。

A3

DFS暴力ac不了不献丑了

Q4

多多有一个长度为n的字符串,这个字符串由26个小写字母组成.

多多可以对这个字符串进行多次操作,每次操作可以把该字符串中一段连续的回文子串删除(单个字符也属于回文串),删除后剩下的串会拼在一起.

请问最少需要多少次操作可以将这个字符串删光.

输入描述

第一行,包含一个正整数T(1≤T≤20)代表测试数据的组数.

对于每组测试数据,仅有一行,代表这个字符串.(1≤n≤ 500)

保证\sigma n 不超过3000

输出描述

对于每组数据输出一行整数,代表多多在进行最少多少次操作后,可以将这个字符串删光.

A4

dp[i][j]代表最小操作数,从小到大枚举区间,并枚举区间分割点。

import sys

t = int(input())
for i in range(t):
    s = input()
    n = len(s)
    dp = [[n]*n for _ in range(n)]
    for i in range(n):
        dp[i][i] = 1
    for k in range(1, n):
      for j in range(0,n-k):
        if s[j] == s[j+k]:
          if k == 1:
            dp[j][j+k] = 1
          else:
            dp[j][j+k] = dp[j+1][j+k-1]
        for i in range(j, j+k):
          dp[j][j+k] = min(dp[j][j+k], dp[j][i] + dp[i+1][j+k])
    print(dp[0][n-1])
#暑期实习##笔试##我的实习求职记录#
全部评论
请问第二题的cnt起什么作用?
点赞 回复 分享
发布于 2024-04-07 16:45 美国
大佬,这种笔试题去哪刷呀? 我只刷过leetcode,这种笔试题完全不会。
点赞 回复 分享
发布于 2024-03-25 10:00 吉林

相关推荐

头像
10-13 18:10
已编辑
东南大学 C++
。收拾收拾心情下一家吧————————————————10.12更新上面不知道怎么的,每次在手机上编辑都会只有最后一行才会显示。原本不想写凉经的,太伤感情了,但过了一天想了想,凉经的拿起来好好整理,就像象棋一样,你进步最快的时候不是你赢棋的时候,而是在输棋的时候。那废话不多说,就做个复盘吧。一面:1,经典自我介绍2,项目盘问,没啥好说的,感觉问的不是很多3,八股问的比较奇怪,他会深挖性地问一些,比如,我知道MMU,那你知不知道QMMU(记得是这个,总之就是MMU前面加一个字母)4,知不知道slab内存分配器-&gt;这个我清楚5,知不知道排序算法,排序算法一般怎么用6,写一道力扣的,最长回文子串反问:1,工作内容2,工作强度3,关于友商的问题-&gt;后面这个问题问HR去了,和中兴有关,数通这个行业和友商相关的不要提,这个行业和别的行业不同,别的行业干同一行的都是竞争关系,数通这个行业的不同企业的关系比较微妙。特别细节的问题我确实不知道,但一面没挂我。接下来是我被挂的二面,先说说我挂在哪里,技术性问题我应该没啥问题,主要是一些解决问题思路上的回答,一方面是这方面我准备的不多,另一方面是这个面试写的是“专业面试二面”,但是感觉问的问题都是一些主管面/综合面才会问的问题,就是不问技术问方法论。我以前形成的思维定式就是专业面会就是会,不会就直说不会,但事实上如果问到方法论性质的问题的话得扯一下皮,不能按照上面这个模式。刚到位置上就看到面试官叹了一口气,有一些不详的预感。我是下午1点45左右面的。1,经典自我介绍2,你是怎么完成这个项目的,分成几个步骤。我大致说了一下。你有没有觉得你的步骤里面缺了一些什么,(这里已经在引导我往他想的那个方向走了),比如你一个人的能力永远是不够的,,,我们平时会有一些组内的会议来沟通我们的所思所想。。。。3,你在项目中遇到的最困难的地方在什么方面4,说一下你知道的TCP/IP协议网络模型中的网络层有关的协议......5,接着4问,你觉得现在的socket有什么样的缺点,有什么样的优化方向?6,中间手撕了一道很简单的快慢指针的问题。大概是在链表的倒数第N个位置插入一个节点。————————————————————————————————————10.13晚更新补充一下一面说的一些奇怪的概念:1,提到了RPC2,提到了fu(第四声)拷贝,我当时说我只知道零拷贝,知道mmap,然后他说mmap是其中的一种方式,然后他问我知不知道DPDK,我说不知道,他说这个是一个高性能的拷贝方式3,MMU这个前面加了一个什么字母我这里没记,别问我了4,后面还提到了LTU,VFIO,孩子真的不会。
走呀走:华子二面可能会有场景题的,是有些开放性的问题了
点赞 评论 收藏
分享
评论
8
25
分享

创作者周榜

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