编译环境: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的初值,以及考虑数据的溢出问题即可。
代码部分实现: