携程算法岗笔试【20230525】

本文介绍了如何解决一道携程笔试题,涉及动态规划方法。题目要求根据试卷题目数量分配给游游,每天做题量必须是K的整数倍。通过分析,提出使用动态规划的思路,即dp[i]表示第i套卷可以得到的最大天数,并给出递推关系式。最后,文章指出这种思路的代码能通过笔试测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前两天写了携程的一道笔试题,感觉题目质量挺不错,这里记录一下。

1. 题目

题目大意如下:
现有n套试卷,每套试卷包含的题目数是i。游游每天的早上和下午都可以选择做一套试卷,当然也可以选择摸鱼(不做题),但是必须满足游游每天做的题目是k的整数倍。求游游最多可以做几天的题?
输入:第一行是n,k;第二行是每套试卷的题数组成的一个数组。
输出:游游最多可以做多少天的题?
样例输入:

5 3 
1 2 3 4 5

样例输出:3
样例解析:

  • 第一天上午做1题,下午做5套题
  • 第二天上午做2题,下午做4题
  • 第三天上午做3题,下午摸鱼
    总共可以做三天。

2.分析

其实这题难在:如何匹配?比如说你怎么知道1要和5搭配,而2就和4搭配?因此暴力的方法行不通。于是尝试考虑使用动态规划的方法。这题用dp来解就非常巧妙。
我们dp[i] 表示第i套卷可以得到的最大天数。 这个令的过程是dp的精华,当然这也不是我一个人想出来的,小师妹跟我一起思考这个问题,然后我就想出来了。
得到假设之后,就需要考虑怎么得到递推式了,即dp[i] 与 dp[i-1]的关系。 其实主要分成两部分:

  • 如果第i天的作业量刚好是k的倍数,那么直接在 dp[i-1]的基础上+1,
  • 如果第天的作业量不是k的倍数,那么就需要判断前面是否有剩余的作业题可以和当前补成k的倍数,如果能补,那么就是 dp[i] = dp[i-1] + 1, 如果不能补,那么就是dp[i] = dp[i-1]

3. 代码

上面这个思想的代码能直接AC笔试题,这里不再给出了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

说文科技

看书人不妨赏个酒钱?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值