牛客真题编程——day17

编译环境:c++

1、投篮游戏

描述:

有一个投篮游戏。球场有p个篮筐,编号为0,1...,p-1。每个篮筐下有个袋子,每个袋子最多装一个篮球。有n个篮球,每个球编号xi 。规则是将数字为xi 的篮球投到xi 除p的余数为编号的袋里。若袋里已有篮球则球弹出游戏结束输出i,否则重复至所有球都投完。输出-1。问游戏最终的输出是什么?

算法思想:

题目思路其实很简单,只需要将整个过程模拟出来即可,还有题目好像没有说明球的编号i是从1开始的,输出结果时需要注意。我的bug是在输入n球个的时候,输入和处理放在了一起,在一开始还是调试了挺久,因为处理的时候可能游戏会中断结束,可是用例的输入并没有完全结束,导致出现后面的结果错误。最后选择了分开两个循环,对每个输入的球的值进行求余,累计相同余数的球的个数,当个数已经不为1时,就可以中断游戏了。如果自然结束,可以额外声明一个bool量来判断是否输出-1标识。

2、最少数量货物装箱

描述:

有重量分别为 3,5,7 公斤的三种货物,和一个载重量为 X 公斤的箱子(不考虑体积等其它因素,只计算重量)

需要向箱子内装满X公斤的货物,要求使用的货物个数尽可能少(三种货物数量无限)

数据范围: 1≤x≤10000

算法思想:

题目其实是一个动态规划的背包问题。设dp[i]为i公斤时的最少货物个数,那么dp[i]一定等于i-3,i-5,i-7三种公斤最少货物数+1中的最小值,那么我们可以得到动态规划的递推方程,即dp[i] = min(min(dp[i-3],dp[i-5]),dp[i-7])+1。首先进行dp3、5、6、7的初始化,然后调用递推式。

代码部分实现:

3、上台阶

描述:

有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或者二级,要走上m级,共有多少走法?注:规定从一级到一级有0种走法。

给定一个正整数int n,请返回一个数,代表上楼的方式数。保证n小于等于100。为了防止溢出,请返回结果Mod 1000000007的值。

算法思想:

这道题也是动态规划。设dp[i]为i阶台阶的走法数,分解子问题有m阶台阶只可能是从第m-1/m-2阶走上来的,因为每次只能走1/2阶台阶。所以可以得到本题的递推式dp[i]=(dp[i-1]+dp[i-2])。记得初始化dp[1]、2、3的初值,以及考虑数据的溢出问题即可。

代码部分实现:

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值