题目链接
解题方法:用DFS+回溯构造前40组,然后再模拟的加到这40组上
题目分析
题目大意
给定n
个蛋糕,大小分别为1~n
,需要把这n
个蛋糕平均分给m
个人,也就是说,每个人可以得到任意块蛋糕,但是每个人得到的蛋糕总大小相同,问如何平分,如果可以输出YES
,并输出m
行,每一行先输出这个人获得的块数k
,然后跟随k
个数,表示哪k
块蛋糕。
解析
挺恶心的一道题,参考题解:HDU 5355 Cake (WA后AC代码,详细解析,构造题)
确定n, m
这个组合能否满足条件有两个判定:
- 每个人获得的平均值应当小于等于n,即需要满足n*(n+1)/2m≥n
- 因为蛋糕不能切,所以需要满足
total % m == 0, total = n*(n+1)/2
先构造n <= 40
的所有情况。用DFS去跑每一个平均值,每次跑,并进行回溯,直到跑到剩余数为0
时return
,跑出来m
次就把这m
组解存储到v[n][m][i][]
中,其中i
表示这m
次中的第i
次。
对于n <= 40
的数据,可以直接从v
中读取答案,对于n > 40
的数据,则需要进行进一步构造。如n=54, m=3
时,可以通过n=6, m=3
构造形成,当1~6
确定下来之后,只需要确定7~54
即可,共计48个数字,可以首位和为61的24组(k组),如7 54
,8 55
,9 56
…然后把这24组再分为m
组,匹配给这m
个人。
由此可以看出,对于任意一组n, m
,需要先找出n‘ = n - k * (2m)
,从表中先找到n', m
的解,然后将这k
组数分配到m
个人头上即可。
最后,跟各位大牛表示同不明白的一个点是:为什么要构建40组?
代码
1 |
|