初想法:这道题刚刚看到的时候居然感觉像是匈牙利???但是看了数据之后崩溃了!郑犇告诉我说这道题他的想法是网络流。然后我并没有什么想法,就贪心耍了一下,还崩掉了。
题解:
这道题的话,正解应该是贪心+优化(虽然说我刚知道的时候是有一点点震惊的!可以用一个链表去维护当前数量的面粉种类有多少种。然后可以再把奶油从大到小排序,在链表上“游走”。数量不足时就向链表小的方向走,数量多余时就往大的方向走(也就是说能尽量往前走就往前走)。有一种特殊情况需要考虑的是:如果此时减的是这个数量de一部分,那么我们就把扣除的那部分到前一个链表+1,然后更大一个链表的种类数也是+1,然后把当前这个点删掉。这样就相当于减了1
时间复杂度为O(N+M)
为什么可以到线性呢?
比如说我当时匹配的是第bi个,bi是从小到大排序的,所以bi+1一定小于等于bi,匹配的数量也是不断递减的。但是我链表上所指到的节点比原先大,所以原来的数目是只会多不会少的(至少是不变的)。那我们只会往前置节点走。
代码实现:
待填坑(数组模拟链表实在是太难写惹!