题目答案
填空位置 ①:
n - nn + 1
填空位置 ②:
M[i] < C[j]
填空位置 ③:
count <= A
填空位置 ④:
check(mid)
填空位置 ⑤:
mid - 1
题目解析
本题主要考查分治算法和贪心算法。check
函数使用贪心算法判断是否能够让 nn 个人租到自行车。贪心策略如下:让钱最多的nn个人租最便宜的nn辆车,其中,钱最少的租最便宜的车,钱第二少的租第二便宜的车,……钱最多的租最贵的车。
① n-nn+1
解释:这空比较难,题目里提示本题是贪心,让最有钱的同学去租最便宜车就可以减少学校A的消耗,j=1
说明车是从便宜的开始,函数入口形式参数 nn 要让最有钱的 nn 个同学去租。
② m[i]<c[j]
解释:此处下一行是统计钱不够的同学让学校出钱数量count
,可以判断count
是学校的支出;i++
说明当前 i 这位同学已经租下了第 j 辆车,即将尝试下一个同学,如果自己带的钱够租,那就不要让学校出钱,如果自己带的钱不够,那就让学校负担C[j]-M[j]
的钱;j++
说明便宜的第 jj 辆车被租走了,即将尝试下一辆车。
③count<=A
解释:函数返回值是 bool,这里是关系运算,返回的应该是A
够不够,④ 处成立的处理语句中mid+1
说明 ④ 是成立的情况,所有count
必须不大于A
。
④ check(mid)
解释:l=mid+l
说明租车的人还可以再多点,A
还很充裕,钱够多。
⑤mid-1
解释:二分套路,租车的人太多,钱不够,要试试人更少的情况。
题目答案
填空位置 ①:
cin.get()
填空位置 ②:
num = c - '0'
填空位置 ③:
c > '0' && c < '9'
填空位置 ④:
num = num * 10 + c - '0'
填空位置 ⑤:
num = -num
题目解析
此题主要实现的是ReadInt
函数,该函数通过逐个读取字符的方法读取一个整数。
该函数的正确流程应该是:过滤掉非数值字符,读取连续数值字符直到遇到非数值字符,同时将读取的字符转化为数值,最后输出数值。
所以,第一个while
循环实现的功能是过滤非数字,这一步只需要不断读取就好,所以仿照上文写cin.get()
。
当退出过滤非数字的while
循环时有两种情况:读取到了数字的第一个字符或者读取到了负数标记。else
分支对应的是读取到了数值,所以应该用字符c
更新num
的大小。
第三,四空是在读取连续的数字,因此循环条件为读取到的字符仍然为数字字符,对num
的更新就是num*10+c-‘0’
。注意:第二、三问的c
值都必须减去‘0’
对应的数值才是正确结果!
第五空对应的是负数的处理,如果负数标记为 11,那么应该取相反数。
题目答案
6,5,4,3,2,1,
题目解析
可以采用分析功能的方法。此程序将一个数组首尾翻转后输出。注意千万不要遗漏最后一个逗号。