EVERYTHING HAPPENS FOR THE BEST|

wnsyou

园龄:2年4个月粉丝:19关注:16

2023-04-23 16:25阅读: 45评论: 0推荐: 0

abc252_f Bread 题解

Bread

好眼熟啊……

题意

有一个长度为 l扩散性百万甜面包要分给 n 个小朋友,第 i 个小朋友想要一根长度为 ai 的面包,保证 1inail,注意是小于等于,即面包可以有剩余。

你可以切面包若干次,每次切面包都需要花费一定力气,每次选择一个长度为 x 的面包,可以将其切成两块长度分别为 ab 的面包,需要满足:1a,bxa+b=x,花费力气为 x

求满足每个小朋友的愿望最少需要多少力气。

思路

正着来做,你并不知道每次该怎么切,所以考虑反着做。

既然是反着做,那么切面包就可以看作是把两个长度分别为 ab 的面包合并成一个长度为 a+b 的面包,耗费力气 a+b

欸,这不就是合并果子吗?

但是需要注意的是,这里可能还有一个长度为 l1inai 的面包,我们肯定不会去切这块面包,所以这里必然只是一根,需要注意。

按照合并果子的贪心做法,每次选择两个较小的面包合在一起,计算答案即可。

记得开long long

总时间复杂度:O(nlogn)

代码

点击查看代码
#include <iostream>
#include <queue>
using namespace std;
using ll = long long;
int n, x;
ll l, sum, ans, a;
priority_queue<ll, vector<ll>, greater<ll>> pq; // 小根堆维护长度最小的面包
int main () {
ios::sync_with_stdio(0), cin.tie(0);
cin >> n >> l;
for (int i = 1; i <= n; i++) {
cin >> x, sum += x, pq.push(x);
}
if (sum < l) { // 特殊处理剩下的那一根面包
pq.push(l - sum);
}
while (pq.size() > 1) { // 合并果子,不用多说
a = pq.top(), pq.pop(), a += pq.top(), pq.pop(), ans += a, pq.push(a);
}
cout << ans;
return 0;
}

本文作者:wnsyou の blog

本文链接:https://www.cnblogs.com/wnsyou-blog/p/17346911.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wnsyou  阅读(45)  评论(0编辑  收藏  举报
  1. 1 勝利への道 安藤浩和
  2. 2 Minecraft’s End Eric Fullerton
  3. 3 月光曲完整版 贝多芬 云熙音乐
  4. 4 平凡之路 (Live版) 朴树
  5. 5 Minecraft C418
  6. 6 Paradise NiziU
  7. 7 叫我,灰原哀 龙大人不喷火
  8. 8 心机之蛙,一直摸你肚子 ——《名侦探柯南》原创同人曲 炊饭,叶辞樱,温海,寒砧,南柯柯,小茜玛姬,盛姝,阿崔Ac,贝壳初,千湛,兮茶子DaYu,乔慕,黎鹿北,起千温卿,遮阳伞,曲悠
  9. 9 战 歌 此去经年
勝利への道 - 安藤浩和
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

暂无歌词

加载中…

{{tag.name}}

{{tran.text}}{{tran.sub}}
无对应文字
有可能是
{{input}}
尚未录入,我来提交对应文字
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示