CSDN 编程竞赛四十七期题解

竞赛总览

CSDN 编程竞赛四十七期:比赛详情 (csdn.net)

竞赛题解

题目1、最小差值

通过对一个数组去掉最多n个数,使得该数组剩余的数中最大者和最小者之差为最小。

这道题目描述很简单,分析一波之后会发现它的解决方法也同样简单。

首先,拿到数据之后进行排序,将数据按照从小到大的顺序排列好。

直接用最后一个数减去第一个数作为默认答案,提交之后发现通过了80%的测试点。

再详细地分析一下,不难发现,如果删掉最大值和最小值中间的数,那么最大值和最小值并没有发生变化,算出的答案自然也就不会变化。显然,这样做是徒劳的。

很明显,需要删掉最大值或最小值,也就是说我们应该从首部或者尾部删掉一些数据(按照题目规则,最多可以删掉n个数)。如果删掉数据之后,最大值和最小值依然没有发生变化,那么答案自然就不会发生变化(典型的例子:最大值和最小值都有多个,删掉n个数之后无法删干净)。这样就可以解释为什么直接输出最大值减最小值还可以通过80%的测试点了,说明这是很典型的一类数据。

再用一个固定长度的滑动区间(滑动窗口),从数据首部滑到数据尾部。

滑动时,刚开始滑动窗口位于数据首部,意味着删掉数据末尾的n个数。

滑动窗口向前移动一步之后,意味着,删掉首部1个数和尾部n-1个数。

每滑动一次,统计出来当前的答案,如果新答案更优的话,就用它替换掉历史最优解。

滑动窗口滑到数据尾部时,即可得到最终答案(全局最优解)。

题目2、风险投资

风险投资是一种感性和理性并存的投资方式,风险投资人一般会对请公允的第三方评估公司对投资对象进行评级,每个风险投资人的风险偏好都不太一样,但是他们的投资原则都一样:1. 把投资对象编号为1、2、3……n。2. 对于大于或等于自己的投资评级的投资对象,都会进行投资。3. 除此以外,还可以从比在已投资对象中编号最小者编号更小的投资对象和比在已投资对象中编号最大者编号更大的投资对象中各随机选一个投资对象进行投资,以对冲过分理性带来的系统性风 险。当然,也可以不选。现在已知投资对象的总数,以及每个风险投资人的投资笔数及进行投资了的投资对象编号。问题 是:根据以上的数据,最少需要为投资对象制定多少个不同的评级级别(假设所有风险投资人的评级标准是一致的)?

这个题目虽然大概看懂了,但是解决起来似乎没有那么容易。博主比较懒,所以就选择直接骗分,很快就通过了一半的测试点。然而,博主发现后面的测试点算出来的答案过大,似乎很难再骗到分,于是赶紧提交了……

你可能感兴趣的:(算法,c++)