Codeforces Raif Round 1 (Div. 1 + Div. 2) E. Carrots for Rabbits(优先队列+贪心)
原题链接
题意
有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(优先队列+贪心)相关推荐
- Codeforces Raif Round 1 (Div. 1 + Div. 2) E. Carrots for Rabbits(贪心)
传送门 题目大意 给出nnn个萝卜,现在需要分成长度为正整数的若干个萝卜,定义每个长度为xxx的胡萝卜贡献为x2x^2x2,问最小的贡献是多少. 解题思路 手玩一下样例,还是不难得出对于一个胡萝卜若需 ...
- 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 ...
- Codeforces Edu Round 68 (Rated for Div. 2)
比较水的一场. 题目链接:https://codeforces.com/contest/1194 A: 秒懂跟x没关系,答案就是2n. B: 因为n*m<=4e5,统计每行每列点的数量后直接O( ...
- Codeforces Edu Round 64 (Rated for Div. 2)
本来在快乐写题的,突然A数据炸了,全场重测,unrated-- 昨晚的题也有点毒,不过总体来说还算简单. A: 一开始我也wa on 3了,仔细想想就会发现有重点的情况. 比如n==3, 3 1 2. ...
- codeforces 1428E. Carrots for Rabbits(贪心(非常优秀的贪心题),结构体重载运算符)
题目链接:https://codeforces.ml/contest/1428/problem/E 题意:给定n个数,要求将这些数拆分为k个数,是这些数的平方和最小. 题解:结构体,一开始想到的是每次 ...
- codeforces(E. Carrots for Rabbits)贪心
题目链接 给你n个数,每个数再被切分若干份(整数),比如5可以切分为2.3或2.2.1等 通过切割将n个数变成k个数,使这k个数的平方和最小. 一开始是想将所有数放在一个优先队列里,每次取出最大的一分 ...
- Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...
- Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...
- 【Codeforces】Round #488 (Div. 2) 总结
[Codeforces]Round #488 (Div. 2) 总结 比较僵硬的一场,还是手速不够,但是作为正式成为竞赛生的第一场比赛还是比较圆满的,起码没有FST,A掉ABCD,总排82,怒涨rat ...
最新文章
- nodejs端口被占用。
- DroidPilot 测试脚本详解 (一)
- mysql-视图、触发器、事务、存储过程、流程控制
- MySql中把一个表的数据插入到另一个表中的实现代码--转
- Qt学习之路(52): 拖放技术之一
- 前端:uniapp封装组件用法笔记
- 95-235-070-源码-task-OneInputStreamTask
- iphone iPhone开发中为UINavigationBar设置背景图片方法
- 电脑cpu温度过高怎么办_解决电脑主板CPU温度过高,COC机箱提升电脑健康指数
- Retrofit完美封装
- STM32控制舵机及其原理
- 有赞订单搜索AKF架构演进之路
- 血淋淋的经验!2021做亚马逊测评是搭上末班车?还是成为新韭菜?
- VC++ 利用MFC的CWindowDC类实现画线功能 在桌面窗口中画线 绘制彩色线条 CPen nPenStyle nWidth crColor
- 有限元基础及ANSYS应用 - 第9节 - 2 平面应变问题的ANSYS分析
- Write-Ahead Log(WAL)的工作原理
- C++进阶_Effective_C++第三版(六) 继承与面向对象设计 Inheritance and Object-Oriented Design
- 迎接互联网的辛迪加时代
- Java多种读写文件文件方法之对比分析
- alibaba的COBAR真是强大.
热门文章
- 软件测试之测试计划与工具(三)
- 【5G网络优化工程师课程5——5G空中接口物理层(物理信道/信号——PDCCH】
- IoT设备配网方式总结
- Python中 whl包、tar.gz包的区别
- 9点击按钮修改valu属性
- 同济大学计算机科学技术考研,2021年同济大学计算机科学与技术(081200)考研专业目录_硕士研究生考试范围 - 学途吧...
- 在千锋“逆战”学习第32天 io练习(2)
- C++中int a和int a的区别
- 更换手机号遇到的一个坑
- 计算机工程类专业职称,工程类中级职称都有哪些专业?