yxy和志愿者小姐姐番外篇之大宝宝123追番记(补题,淘汰赛)

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;
}

猜你喜欢

转载自blog.csdn.net/qq_41818544/article/details/83214168
今日推荐