CF1428E. Carrots for Rabbits

题意:

给你nnn个正整数,分成kkk个正整数,要求分好之后∑i=1kai2\sum\limits_{i=1}^{k}{a_i}^{2}i=1∑k​ai​2最小。

思路:

可以想到将aia_iai​均分会使aia_iai​的和减少的最多。假设我们把aaa分成b,cb,cb,c两份,那么:
a2−(b2+c2)=(b+c)2−(b2+c2)=2bc=2b(a−b)=2ab−2b2\begin{aligned}a^2-(b^2+c^2)&=(b+c)^2-(b^2+c^2)\\&=2bc\\&=2b(a-b)\\&=2ab-2b^2\end{aligned}a2−(b2+c2)​=(b+c)2−(b2+c2)=2bc=2b(a−b)=2ab−2b2​
设f(b)=2ab−2b2f(b)=2ab-2b^2f(b)=2ab−2b2
则f′(b)=2a−4bf^{'}(b)=2a-4bf′(b)=2a−4b
可得在b=a2b=\cfrac{a}{2}b=2a​的时候取到极大值。
同理,将aaa尽可能平分得到的平方和减少的会最多。
所以我们设g(a,b)g(a,b)g(a,b)是将aaa分成bbb份的时候的平方和。
我们只需要按照g(a,b)−g(a,b+1)g(a,b)-g(a,b+1)g(a,b)−g(a,b+1)的值维护优先队列即可。
ps.
这题思路对了,结果优先队列不会写重载,现场学了一下结果写的时候写错了一个小地方。然后这场血崩,直接掉蓝。

代码:

#include<bits/stdc++.h>
#define pii pair<int,int>
#define int long long
#define cl(x,y) memset(x,y,sizeof(x))
#define ct cerr<<"Time elapsed:"<<1.0*clock()/CLOCKS_PER_SEC<<"s.\n";
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define lson x<<1,l,mid
#define rson x<<1|1,mid+1,r
#define INF 1e18
const int N=1e6+10;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
const double pi=acos(-1);
using namespace std;
struct edge
{int w,t,id;
}a[N];
int f(int w,int t)
{int res=0;int w1=w%t,w2=t-w1,v=w/t;res+=w1*(v+1)*(v+1);res+=w2*v*v;return res;
}
struct cmp
{bool operator ()(const edge& a, const edge& b){int sum1=f(a.w,a.t),sum2=f(a.w,a.t+1);int sum3=f(b.w,b.t),sum4=f(b.w,b.t+1);return sum1-sum2<sum3-sum4;   }
};
signed main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n,k,i;cin>>n>>k;int p=k-n;priority_queue<edge,vector<edge>,cmp> q;for(i=1;i<=n;i++){cin>>a[i].w;a[i].t=1;a[i].id=i;if(a[i].t==a[i].w)continue;q.push(a[i]);}while(p--){edge pre=q.top();q.pop();a[pre.id].t++;if(a[pre.id].t==a[pre.id].w)continue;q.push(a[pre.id]);    }   int ans=0;for(i=1;i<=n;i++)ans+=f(a[i].w,a[i].t);cout<<ans<<endl;return 0;
}

(贪心)CF1428E. Carrots for Rabbits相关推荐

  1. 【做题记录】CF1428E Carrots for Rabbits—堆的妙用

    CF1428E Carrots for Rabbits 题意: 有 \(n\) 个萝卜,每个萝卜的初始大小为 \(a_i\) .现在要把这些萝卜切为为 \(k\) 个.吃每一个萝卜的时间为这个萝卜的大 ...

  2. Codeforces 1428E Carrots for Rabbits 贪心

    文章目录 题意 题解 题目链接 我又掉了. CF上少见的优秀贪心题,有必要拿出来讲一下. 题意 n个数切成k份,求切出数的平方和的最小值. 题解 首先证明当对一个数字切的份数越多,因切分而减少的平方和 ...

  3. CF1428 E. Carrots for Rabbits 贪心+优先队列

    n个数切成k份,求切出数的平方和的最小值. 有个比较显然的结论: 对于一个数x,把它分成y份,求平方和sm,使得sm最小的分法一定是均分. 而把一个数分成y份,平方和与分成y-1份的平方和减量设为Cy ...

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

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

  5. E. Carrots for Rabbits(贪心)

    题意: 有n个萝卜 ,每根萝卜长度不一样,现在将这些萝卜分为k段 这k根萝卜每根萝卜的花费是长度的平方,求最小的花费. 思路: 原本想的是放进将萝卜放进大根堆,然后取最大的对半分,其实这样是不正确的, ...

  6. Codeforces1428 E. Carrots for Rabbits(贪心+堆)

    题意: 解法: 要让一个数切割之后权值最小,那么一定是均等切割.先计算出总权值, 将所有数以{总大小,切割次数}的形式丢尽堆中, 因为题目要让总权值最小,那么优先取出:再切割一次,权值变化更大的即可. ...

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

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

  8. CF(Div. 1 + Div. 2) E. Carrots for Rabbits(优先队列+贪心)

    原题链接 题意: 给你n个数,要你把n个数切成k个.求切后最小平方和. 题解 一开始就想着把每个数放进优先队列里,然后把最大的平分,再放回去.但这样是错的.如1 3 100 :33 33 34会更好. ...

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

    原题链接 题意 有N个萝卜,K只兔子,要求把N个萝卜分成K份,一个兔子吃一个长为X的萝卜的时间为X*X,求怎么分能使最后的时间最短. 思路 刚看到这个题的时候,刚开始的思路是,把所有的萝卜都存在一个大 ...

最新文章

  1. 树的方向,风决定;人的方向,自己决定
  2. 如何获取js对象的对象名
  3. Oracle 常见的33个等待事件
  4. python 数组合并排重_并排深度学习:Julia vs Python
  5. 六年级下册百分数计算题_小学六年级数学期末考,题量较大,出题全面、灵活...
  6. 安装redis并开启_如何安装Redis,以及对Redis配置文件的更改和测试
  7. mysql5.7.20官方文档,MySql 5.7.20安装及data和my.ini文件的配置
  8. python 逆序_python编程题-句子的逆序
  9. 数据分析和数据挖掘有什么区别
  10. c语言答案知码,C语言笔试习题集答案和解析.doc
  11. Java程序员职业生涯规划
  12. 【收藏】来电显示Modem
  13. PDF文件太大怎么压缩
  14. windows、ubuntu双系统安装教程
  15. vue 通过自定义规则实现表单手机号和邮箱的校验
  16. python are you ready_如果要检查recv_ready(),是否必须检查exit_status_ready?
  17. python200行代码_200行Python代码实现2048
  18. 《华为区块链白皮书》重磅发布 华为云区块链服务BCS专注4大类9小类应用场景
  19. python 预约系统_Python_字典实现简单预约系统
  20. 1.Concurrent概述

热门文章

  1. 部署hexo遇到报错ERROR Deployer not found: git的解决办法
  2. 软件工程师的薪资为何如此之高
  3. Python综合案例2(险种缴费记录管理)
  4. IOT设备情况数据分析
  5. 晴天科技冲刺上市:实控人丁一波系本科肄业,粤民投为其股东
  6. eclipse下载网址收藏
  7. (8)C#导入库编译出错:请考虑使用 app.config 将程序集“log4net, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a”
  8. 推荐系统实战4——EasyRec 搭建DSSM召回模型实现CTR点击平台
  9. “独裁”的张小龙和他的微信帝国诞生记
  10. 用芝麻二维码生成器制作App下载二维码