ssoj2503: ZCC loves meat(meat)

时间限制: 1 Sec 内存限制: 512 MB Special Judge O2
提交: 109 解决: 35
[提交][状态][博客][加入收藏]
题目描述
ZCC终于打开了密码箱,发现里面只是一堆风干的肉条,于是他打算喂狗。

ZCC养了n条狗,有m根肉条,他想把肉条一根不留地分给狗,并使得每条狗至少有一条肉条可吃。狗总是很贪心,它们不希望看到有其他的狗有更多的肉条,否则就会不开心。一条狗的不开心程度可以表示为他的贪心程度和拥有比它更多肉条的狗的数量的乘积。现在ZCC想知道一种分配方式使得狗们的不开心程度的和最小。

输入
第一行包含两个数n,m 。

第二行包含n个数g_i表示第i条狗的贪心程度。

输出
第一行包含一个数s,表示不开心程度的和的最小值。

第二包含n个数p_i,表示第i条狗得到的肉条数。

样例输入
3 20
1 2 3
样例输出
2
2 9 9
提示
数据规模与约定

对于10%的数据:1≤n≤m≤6

对于40%的数据:1≤n≤50 , n≤m≤500

对于100% 的数据:1≤n≤50 , n≤m≤5000 , 1≤g_i≤10^7

来源
杭二

测试得分:0

题解
因为是将m个物品分为n份,每份不为0,求最值的问题,故考虑DP。记f[i][j]为将i个物品分为j份的最小值,但这样转移时还要考虑每一份的个数,故考虑能不能发现某些性质,使其更易转移。按照贪心的思想,发现贪婪度大的要分配较多(因为若有一种分配方案中存在一个贪婪度较小的比一个贪婪度较大的分配更多,则交换它们后一定更优),那么按贪婪度从大到小排序,则转移时只需记录最小值即可,但这样是O((NM)^2)的,故考虑优化。(以上是在考场想到的,然而代码写完后发现细节好多,输出方案极为麻烦,于是本题就爆零了。以及一个很不靠谱的贪心:所有的份的物品数只分为两个值,值小的对值大的造成贡献,枚举其中一个值的份数,取最小值,有几位神犇们类似这样写得了60分,而我。。。下次一定记住不会写就假装自己错误写法很有道理的样子尽量骗分)
考虑能优化的只有最值这一维,我们注意到其实记录最值多一维m是没有必要的,因为与答案有关的的只是它们的相对大小关系,即每份减少同样的数量后的状态可以转移到此状态,但题目有限制,即每份个数大于等于一,所以减少到最小值为一时就不能再减少。而每份个数是不增的,即对于f[i][j],最小值是第i份,所以只需考虑第i份是否为一(这也是为什么从大到小,而不是从小到大排序的原因,这样做可以使考虑的对象仅有第i份,巧妙地达到了化简的效果),所以若第i份大于一,则转移到所有同时减一的情况;若第i份等于一,因为要计算有多少同样为一的,都会对答案产生影响,故应枚举它,这样可以由都大于一的状态转移而来(即要明确会有多少个对多少个产生影响,若不这样枚举,则无法确定)。
因为要输出方案时,先记下每一个状态的先前状态,对于从i同样的转移过来,就将1到i全部加一;否则将那些为一的部分加一。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值