原题链接
题意
有N个萝卜,K只兔子,要求把N个萝卜分成K份,一个兔子吃一个长为X的萝卜的时间为X*X,求怎么分能使最后的时间最短。
思路
刚看到这个题的时候,刚开始的思路是,把所有的萝卜都存在一个大根堆里面,然后每次取堆头元素分为两份,直到最后大根堆中的数量刚好等于K,但是交上去以后发现WA了,又想了一下,确实不能这样,因为你不确定每一个萝卜分成几段,比如10这根萝卜,第一次分成5,5,第二次再分是5,3,2,但是这样分并不是最小的,因为3,3,4这样分是最小的。
最后看了大佬的思路以后才想起来,先把现有萝卜吃完所需要的时间是

ans+=(a[i]*a[i]+(a[i+1]*a[i+1]+.....

然后用一个大根堆存一个萝卜划分为1,到划分为2的差值,每一个都存进来,那一个差值最大,就先分那一个,然后再把这个萝卜从2划分为3的差值存进优先队列,依次找k-n个值。
代码

#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
const int N=1e5+10;
typedef long long ll;
ll a[N];
struct Node
{ll val;  // 这一次与下一次的差值ll now;ll nex;ll id;ll num;bool operator < (const Node &r) const{return val<r.val;}
};
ll f(int id,int num)
{if(num>=a[id]) return 1e18;num++;ll em=a[id]/num;ll ym=a[id]%num;ll ans=0;for(int i=1 ; i<=num-ym ; i++) ans+=(em*em);for(int i=1 ; i<=ym ; i++) ans+=((em+1)*(em+1));return ans;
}
priority_queue<Node> q ;
int main()
{int n,k;cin>>n>>k;ll ans=0;for(int i=1 ; i<=n ; i++){cin>>a[i];ll now=a[i]*a[i];ll nex=f(i,1);q.push(Node{now-nex,now,nex,i,1});ans+=now;}int num=k-n;while(num--){Node tp=q.top();q.pop();ans-=tp.val;ll nex=f(tp.id,tp.num+1);q.push(Node{tp.nex-nex,tp.nex,nex,tp.id,tp.num+1});}cout<<ans<<endl;return 0;
}

Codeforces Raif Round 1 (Div. 1 + Div. 2) E. Carrots for Rabbits(优先队列+贪心)相关推荐

  1. Codeforces Raif Round 1 (Div. 1 + Div. 2) E. Carrots for Rabbits(贪心)

    传送门 题目大意 给出nnn个萝卜,现在需要分成长度为正整数的若干个萝卜,定义每个长度为xxx的胡萝卜贡献为x2x^2x2,问最小的贡献是多少. 解题思路 手玩一下样例,还是不难得出对于一个胡萝卜若需 ...

  2. acm-(贪心)Codeforces Raif Round 1 (Div. 1 + Div. 2) E. Carrots for Rabbits

    传送门 本题的贪心十分巧妙,我们考虑将所有数字的划分状态表示为(x,cur,v)(x,cur,v)(x,cur,v)的形式,xxx代表数字值,curcurcur为当前xxx被分成的份数,vvv代表从c ...

  3. Codeforces Edu Round 68 (Rated for Div. 2)

    比较水的一场. 题目链接:https://codeforces.com/contest/1194 A: 秒懂跟x没关系,答案就是2n. B: 因为n*m<=4e5,统计每行每列点的数量后直接O( ...

  4. Codeforces Edu Round 64 (Rated for Div. 2)

    本来在快乐写题的,突然A数据炸了,全场重测,unrated-- 昨晚的题也有点毒,不过总体来说还算简单. A: 一开始我也wa on 3了,仔细想想就会发现有重点的情况. 比如n==3, 3 1 2. ...

  5. codeforces 1428E. Carrots for Rabbits(贪心(非常优秀的贪心题),结构体重载运算符)

    题目链接:https://codeforces.ml/contest/1428/problem/E 题意:给定n个数,要求将这些数拆分为k个数,是这些数的平方和最小. 题解:结构体,一开始想到的是每次 ...

  6. codeforces(E. Carrots for Rabbits)贪心

    题目链接 给你n个数,每个数再被切分若干份(整数),比如5可以切分为2.3或2.2.1等 通过切割将n个数变成k个数,使这k个数的平方和最小. 一开始是想将所有数放在一个优先队列里,每次取出最大的一分 ...

  7. Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...

  8. Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...

  9. 【Codeforces】Round #488 (Div. 2) 总结

    [Codeforces]Round #488 (Div. 2) 总结 比较僵硬的一场,还是手速不够,但是作为正式成为竞赛生的第一场比赛还是比较圆满的,起码没有FST,A掉ABCD,总排82,怒涨rat ...

最新文章

  1. nodejs端口被占用。
  2. DroidPilot 测试脚本详解 (一)
  3. mysql-视图、触发器、事务、存储过程、流程控制
  4. MySql中把一个表的数据插入到另一个表中的实现代码--转
  5. Qt学习之路(52): 拖放技术之一
  6. 前端:uniapp封装组件用法笔记
  7. 95-235-070-源码-task-OneInputStreamTask
  8. iphone iPhone开发中为UINavigationBar设置背景图片方法
  9. 电脑cpu温度过高怎么办_解决电脑主板CPU温度过高,COC机箱提升电脑健康指数
  10. Retrofit完美封装
  11. STM32控制舵机及其原理
  12. 有赞订单搜索AKF架构演进之路
  13. 血淋淋的经验!2021做亚马逊测评是搭上末班车?还是成为新韭菜?
  14. VC++ 利用MFC的CWindowDC类实现画线功能 在桌面窗口中画线 绘制彩色线条 CPen nPenStyle nWidth crColor
  15. 有限元基础及ANSYS应用 - 第9节 - 2 平面应变问题的ANSYS分析
  16. Write-Ahead Log(WAL)的工作原理
  17. C++进阶_Effective_C++第三版(六) 继承与面向对象设计 Inheritance and Object-Oriented Design
  18. 迎接互联网的辛迪加时代
  19. Java多种读写文件文件方法之对比分析
  20. alibaba的COBAR真是强大.

热门文章

  1. 软件测试之测试计划与工具(三)
  2. 【5G网络优化工程师课程5——5G空中接口物理层(物理信道/信号——PDCCH】
  3. IoT设备配网方式总结
  4. Python中 whl包、tar.gz包的区别
  5. 9点击按钮修改valu属性
  6. 同济大学计算机科学技术考研,2021年同济大学计算机科学与技术(081200)考研专业目录_硕士研究生考试范围 - 学途吧...
  7. 在千锋“逆战”学习第32天 io练习(2)
  8. C++中int a和int a的区别
  9. 更换手机号遇到的一个坑
  10. 计算机工程类专业职称,工程类中级职称都有哪些专业?