洛谷P4447 [AHOI2018初中组] 分组(贪心、优先队列)
题目来源:https://www.luogu.com.cn/problem/P4447
借鉴的佬的题解:https://www.luogu.com.cn/article/ywh0hzst
记录一下思路出错得很彻底的一道题,且(偷)看题解之前一直没想到自己错在哪————
错误版:一开始就是觉得从头开始查,一旦符合了就无脑往可以放的组里塞,然后遇到了放不了的(就是断点),如果是重复数字就记录下来,如果不是重复的单纯断就再开一个组。
偷看题解之后发现错的很离谱,比如这个1 2 2 3 3 4 5,最小组应该有3个人,‘1 2 3’,但是我这个无脑放、遇到放不了的就过的思路会导致分组分成了‘1 2’‘2 3’‘3 4 5’这样的组;;
修改版:然后又想了一个思路就是把每个组最后的数字记录下来、把它们的大小也记录下来,当遇到一个新的数字的时候找出所有它可以放的组(如果放不了就新开),在这些组中,往大小最小的组里塞新数,这样小的一直被增加,可以保证“公平公正”、、也就是贪心真正贪的地方(而不是之前我那个贪心地无脑强塞)
思路有了、、因为stl不扎实差点写出一坨恶心的代码,,还好正好看到一个佬的题解(链接见上),,所以说本来想的是要储存组的大小、组的号、组的尾巴上的数,后来想到放哪个组无所谓所以组的号码不用存了就存它的大小就行了,每个组的意义也就是大小),OK又是一题令人悲的绿题
补录:虽然是极大借鉴题解但是这道题总体还是自己打的,还是有bug
debug第一次:没有开‘if (p[a[i]] == 0) { p[a[i]] = ++k; }’,导致每次把组的大小更新到新一个尾巴的queue时,新尾巴的queue不存在,所以要及时初始化每一个尾巴对应的
debug第二次:priority_queue默认是从大到小……亏大了,这错误真的难找啊……

浙公网安备 33010602011771号