题目链接
解题方法:用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 |
|