1264: yxy和志愿者小姐姐番外篇之大宝宝123追番记
时间限制: 1 Sec 内存限制: 64 MB
提交: 46 解决: 13
[提交][状态][讨论版][命题人:ZBT]
题目描述
yxy和小姐姐幸福而快乐地生活在一起后,就抛弃了他的队友——大宝宝123
为了填补心灵上的空虚只能无聊地追番(一个番就是一部动漫)
他的计划是这个月看完M集动漫,他的手头的钱都给yxy追妹子了,所以他并没有多少钱,
故而他并不在乎看的是什么番剧,只要不重复地看够M集(1<=M<=100000)就可以了。
AcmliAcmli动漫网有N个番(1<=N<=100000),AcmliAcmli动漫网是一个奇特的网站。
它的特点是:
1.收录的番很独特,都是无限连载的,也就是说,只要你有钱,从第1集开始你想看多少集就看多少集。
2.收费方式独特,每部剧都有三个整数特征值A,B,C(1<=A<=10000,1<=B<=10000,1<=C<=10000),
你看第X集的费用F为:F = A*X^2 + B*X + C
大宝宝123想知道,他追完M集至少需要多少钱
输入
只有一组数据
第一行有两个整数,N与M,分别表示AcmliAcmli网站收录的动漫的个数和大宝宝123想看的动漫的集数
接下来M行,每行3个整数描述一个番的特征值A,B,C
输出
输出一个整数代表大宝宝123同学追完M集至少需要多少钱
样例输入
10 5 73 41 47 82 29 78 46 28 18 6 66 67 98 36 85 50 98 27 64 60 95 27 88 62 34 16 39 84 52 1
样例输出
618
一道充分利用优先队列的题目:算是纯模拟吧。
1.将n部剧的第一集存如优先队列中
2.从优先队列中弹出花费最小的一集,一直维护最小的每一集的最小花费
3.将最小集数花费加入到总的花费中,再将下一集存入优先队列中
4.重复2、3操作,直到看完最后一部剧,输出结果
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
#include<string>
using namespace std;
typedef long long LL;
struct Node{
LL a, b, c;
int jishu;
LL val;
friend bool operator < (const Node& A, const Node& B){
return A.val > B.val;
}
};
int n, m;
priority_queue<Node>pq;
int main()
{
scanf("%d%d", &n, &m);
Node node;
for(int i = 0; i < n; i++){
scanf("%lld%lld%lld", &node.a, &node.b, &node.c);
node.val = node.a + node.b + node.c;
node.jishu = 1;
pq.push(node);
}
LL res = 0;
for(int i = 0; i < m; i++){
res += pq.top().val;
node = pq.top();
pq.pop();
node.jishu++;
node.val = node.a*node.jishu*node.jishu + node.b*node.jishu + node.c;
pq.push(node);
}
printf("%lld\n", res);
return 0;
}