1. 程式人生 > >yxy和志願者小姐姐番外篇之大寶寶123追番記(補題,淘汰賽)

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