\(\mathcal{Preface}\)
分数分布:\(100+100+100+100= 400\)。
AK 了,开心呀!
\(\mathcal{Problem \space{} A}\)
Tag:诈骗,排序,贪心。
赛时看到题,一下子没反应过来,以为是超难 DP 题。
过了 B & C 之后回过头来看,原来所有金币的消失时间是互不相同的呀!那么这不就是个诈骗了吗?只要等到每枚金币最后消失的时间再去取它就好了,因此这就变成了一个简单的排序加贪心,只要将所有金币的价值从大到小排序,然后贪心选取前 \(k\) 个的价值加起来就可以啦。
时间复杂度 \(O(n \log n)\),瓶颈在于排序。
\(\mathcal{Problem \space{} B}\)
Tag:简单数学,贪心 / 暴力枚举,判断。
首先可以运用一个简单的数学知识,如果两个数的加和相同,那么这两个数的差越小,它们的乘积就越大。
那么就可以从最高位开始找到第一个不相同的位置,然后标定 \(a\) 为较小的一个数,之后就都让 \(a\) 的数位比 \(b\) 的数位大就行了。
但是这题还有一个法子,因为 \(a,b < 10^5\),因此暴力枚举也是可以的,这边采用了状压的形式来枚举要交换哪些位置,也就是枚举二进制数 \(st\),如果这一位的值为 \(1\) 说明要交换否则不用交换。算出值以后挨个取 \(\max\) 就可以了。
如用贪心法,时间复杂度为 \(O(|a|)\);如用暴力枚举法,时间复杂度为 \(O(2^{|a|} \times |a|)\);在这里,\(|a|\) 和 \(|b|\) 是没有区别的。
\(\mathcal{Problem \space{} C}\)
Tag:简单思维,高精除。
想到一个等式,\(k \space{} 个空瓶子 = 喝 \space{} 1 \space{} 杯饮料 + 1 \space{} 个空瓶子\),然后把右边的 \(1 \space{} 个空瓶子\) 移项到左边,变成 \((k-1) \space{} 个空瓶子 = 喝 \space{} 1 \space{} 杯饮料\),那么直接高精除,用 \(n \div (k-1)\) 就可以了。余数是不用在意的,因为多出来的饮料瓶没办法再换了,因为它是余数嘛!
时间复杂度 \(O(|n|)\)。
\(\mathcal{Problem \space{} D}\)
Tag:STL 的运用,贪心。
我的做法和老师的不一样,麻烦老师看看我这个做法有没有什么漏洞 /kel
由于我们只能按照病人的病情严重度来依次医治——如果不考虑到来时间的话——而又因为病人的病情严重度互不相同——所以在某一时刻可以医治的病人是唯一确定的!不存在说有多个病人病情严重度相同,然后还要用 DP 合理分配的这种情况。
所以就是说,当时间确定的情况下,需要一个容器能够合理存储下当前还没被医治的病人的情况,并且还要按照病情严重度从重到低排序。想到了什么?对,就是优先队列 priority_queue
!当然,需要塞进去一个结构体,因此需要重载比较符。
考虑将所有病人按照到来的时间排序,然后依次考虑每个病人。为了更好地维护当前医生要医治的时间可以是什么时候,用 \(NowTim\) 变量记录医生当前做的最后一次手术的结束时间再往后一刻是什么时候,即当前的时间。最初,\(NowTim = 1\)。
每次进来一个病人之后,我们先考虑这个病人到来之前的情况。那么不断取出优先队列的队头,如果现在所剩余的时间足够医治这位病人——也就是说,医治完他,并不会被马上要进来的这位病人发现——因为如果被发现了也许会发生医闹——那么就医治他,并加上医生能够得到的金币。当然了,\(NowTim\) 的值也需要更新。
但是如果 \(NowTim\) 的时间比当前取出队头的这位病人的到来时间还要早,我们该怎么办?可以看一下,如果让这位病人一到来就做手术,时间是否足够。如果足够,可以先让 \(NowTim\) 改为这位病人到来的时间,然后再给这位病人做手术。
循环的中途,一定记得判断一下,如果当前这个病人的到来时间 \(> k\) 了,也就是说在医生已经下班之后才来的话,就直接 break
掉好啦,因为医生根本见不到他,当然就不需要考虑他咯。
循环结束了,就搞定了吗?不对,我们还要以结束时间为 \(k\),继续再跑,直到医生下班才能够结束整个情况!因为可能在所有病人都来过之后,继续医治嘛,这是很正常的现象啦!
记得开 long long
,然后中间有些许小细节要注意一下。
时间复杂度 \(O(n \log n)\)。
\(\mathcal{Summary}\)
这一次能 AK 的关键还是在于 D 想出了一个应该没啥问题的做法,然后也是因为前三道题做的比较快才给 D 预留了足够的思考时间。因此,根据这次的经验,我认为,如果要去攻破后几题甚至是压轴题去拿到一个比较高的分的话,有一个至关重要的点就是前面的题不能卡太久,要给后面的难题预留充分的时间,这样子就算是暴力可能也能拼出来更多吧。
继续加油,再接再厉!