【题解】牛客练习赛84

A - 牛客推荐系统开发之静态特征获取

Solution

C++用STL的std::map以及std::set就可以解决了。

Code

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=47969828

B - 牛客推荐系统开发之女装药水

Solution

显然在某个位置扔两次女装药水和不扔是同样的效果。

状态压缩枚举每一个位置扔或不扔即可。

Code

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=47969831

C - 牛客推荐系统开发之选飞行棋子

Solution

令这四个人分别为ABCD。

枚举A和B的情况,时间复杂度

枚举C和D的情况,时间复杂度

将枚举的情况容斥整合,时间复杂度

(还有复杂度更低的做法)

Code

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=47969832

D - 牛客推荐系统开发之动态特征获取

Solution

用一个单调链表以存优先级顺序存放动态特征的指针,用另一个单调链表以动态特征拿取时间顺序存放动态特征的指针。

用两个哈希表(或大数组)存放某个编号的动态特征在两个链表中的位置。

然后按照题目要求进行模拟即可。

除了排序部分时间复杂度为,其余部分时间复杂度为

时间复杂度 空间复杂度

Code

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=47969834

补充

出题人在某公司的推荐系统后端开发中实习过一段时间,由此设计出了D题,本题错误率很高。

有两位同学分享了他们的解法:


Code: https://ac.nowcoder.com/acm/contest/view-submission?submissionId=47971200


Code: https://ac.nowcoder.com/acm/contest/view-submission?submissionId=47972471

通过对拍数据发现,这两个同学都是因为置信度不够的特征有可能没有被删掉导致答案错误。

如果还有用类似算法的同学可以通过下面的这组数据来验证一下:

10 3 5
5 1
1 2
4 3
3 4
5 5
1 6
1 7
3 8
3 9
1 10

输出应该为:

YES
YES
YES
YES
YES
YES
NO
NO
YES
NO

当然,过了这组也不一定能通过本题,如果这组数据过了,Windows平台下可以用下面的代码进行对拍:

import os
import cyaron

os.system("g++ -o std std.cpp -O2")
os.system("g++ -o user user.cpp -O2")

for i in range(100):
    io = cyaron.IO(file_prefix='', data_id=1)
    n = 30
    io.input_writeln(n, 3, 5)
    for i in range(n):
        io.input_writeln(cyaron.randint(1, 5), i + 1)
    io.output_gen("std")
    io.close()
    os.system("user < 1.in > user.1.out")
    if os.system("fc 1.out user.1.out > out") != 0:
        print('found')
        break

环境配不了的自己写对拍

E - 牛客推荐系统开发之标签重复度

Solution

考虑点分治:

对于经过某点的路径,显然都能拆分为两条以点为起点的路径。

对任一路径,可以表示为,其中为路径上最小的权值,为最大的权值,显然路径对答案的贡献为

那么,对于两条以点为起点的路径,拼接得到的路径即为

如何在已知的条件下求的贡献?容易发现,对任意两条路径的拼接,都能归结为以下三类中的一类:

  1. ,
  2. ,

对上述三种情况分别做一次二维偏序即可。

二维偏序的时间复杂度为,故点分治的总时间复杂度为

Code

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=47969835

F - 牛客推荐系统开发之下班

Solution

莫比乌斯函数前缀和用杜教筛很容易求。

斐波那契数列前缀和求法:

显然,可以用二次剩余求得

可以知道

则有

可以预处理后求得。

然后用数论分块的方法求解即可。

Code

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=47969838

全部评论
一楼
1 回复 分享
发布于 2021-06-11 22:41
请问C题复杂度更低的做法是?
点赞 回复 分享
发布于 2021-06-11 23:48
C题状压 DP, 复杂度 O(n64) https://ac.nowcoder.com/acm/contest/view-submission?submissionId=47968822
点赞 回复 分享
发布于 2021-06-12 07:39
新增了D题的一些补充,有需要的同学可以看看。
点赞 回复 分享
发布于 2021-06-13 12:16
某位菜鸡被D题卡成了狗🙄
点赞 回复 分享
发布于 2021-06-14 12:10
ningningningningning
点赞 回复 分享
发布于 2021-09-14 16:01

相关推荐

不愿透露姓名的神秘牛友
11-24 20:55
阿里国际 Java工程师 2.7k*16.0
程序员猪皮:没有超过3k的,不太好选。春招再看看
点赞 评论 收藏
分享
10-24 11:10
山西大学 Java
若梦难了:哥们,面试挂是很正常的。我大中厂终面挂,加起来快10次了,继续努力吧。
点赞 评论 收藏
分享
评论
2
收藏
分享
牛客网
牛客企业服务