CF1428E Carrots for Rabbits

题意:

有 \(n\) 个萝卜,每个萝卜的初始大小为 \(a_i\) 。现在要把这些萝卜切为为 \(k\) 个。吃每一个萝卜的时间为这个萝卜的大小的平方,求吃完所有萝卜的最小时间,即 \(\sum_{i=1}^{k}{a_i^2}\) 最小 。求出最小值 。

题解:

  • 二分是错的 。

  • 贪心切两段是错的 。

正解:

令 \(f(i,cnt)\) 为把第 \(i\) 个萝卜分为 \(cnt\) 个后吃完的最少时间,则初始答案为 \(\sum_{i=1}^{n}{f(i,1)}\) 。

维护一个小根堆,存的值为 \(f(i,cnt)-f(i,cnt+1)\) ,每一次取出堆顶,将堆顶的萝卜再切一段下来,并塞回堆中 。

在这一次操作中,答案减小了 \(f(i,cnt)-f(i,cnt+1)\) ,且这个值在这一次切割操作中是最优的,所以答案是正确的。

以上操作进行 \(k-n\) 次 。

最终的答案为初始答案减去每一次取出堆顶后对答案减小的值。

大致代码:

int n,k,a[Maxn];
ll ans;
ll f(ll sum,ll cnt)
{
return (sum%cnt)*(sum/cnt+1ll)*(sum/cnt+1ll)+(cnt-(sum%cnt))*(sum/cnt)*(sum/cnt);
}
struct Data
{
ll sum,cnt;
bool friend operator < (Data x,Data y)
{
return (f(x.sum,x.cnt)-f(x.sum,x.cnt+1ll))<(f(y.sum,y.cnt)-f(y.sum,y.cnt+1ll));
}
};
priority_queue<Data> q;
// main
n=rd(),k=rd();
for(int i=1;i<=n;i++) a[i]=rd(),q.push((Data){1ll*a[i],1ll}),ans+=1ll*a[i]*a[i];
for(int i=1;i<=k-n;i++)
{
Data cur=q.top(); q.pop();
ans-=(f(cur.sum,cur.cnt)-f(cur.sum,cur.cnt+1ll)),cur.cnt+=1ll;
q.push(cur);
}
printf("%lld\n",ans);

最新文章

  1. div+css:div中图片垂直居中
  2. MyBatis的Mapper文件的foreach标签详解
  3. Shell入门教程:流程控制(4)case 条件判断
  4. python数据类型及其常用方法
  5. Java---类反射(1)---类反射入门和基础
  6. 数值运算内建函数(core python programming 2nd edition 5.6.2)
  7. Balls Rearrangement(HDU)
  8. js 报错 :object is not a function
  9. Android pm命令用法
  10. VS窗体选择BackGroupImage属性报错:已添加具有相同键的项
  11. 进程管理之wait和waitpid
  12. 虚拟机中ubuntu-16.04 Linux系统下配置mysql数据库,并在windows下使用navicat远程连接
  13. golang社区
  14. Linux指令--nl
  15. ●洛谷P3168 [CQOI2015]任务查询系统
  16. JAVA Set 交集,差集,并集
  17. html5 input输入实时检测以及延时优化
  18. jQuery实现input框输入值动态搜索
  19. 「POJ - 2318」TOYS (叉乘)
  20. 10.18正式开发stark组件*(三)

热门文章

  1. form表单提交失败
  2. 关于AS下Gradle安装问题总结
  3. 变着花样来接参,PHP中接收外部参数的方式
  4. dede织梦会员模板调用template下模板head.htm方法及解析变量
  5. TP5关联模型出现疑问,待解决
  6. chrome浏览器中安装以及使用Elasticsearch head 插件
  7. 给你一个app,怎么测试
  8. Go语言之函数
  9. 数据结构与算法——弗洛伊德(Floyd)算法
  10. SDOI2015 排序