蓝桥杯第七场小白赛 5.兽之泪【算法赛】 知识点:优先级队列

132 阅读1分钟

5.兽之泪【算法赛】 - 蓝桥云课 (lanqiao.cn)

image.png

#include<bits/stdc++.h> 
using namespace std;
#define int long long
string p[20];
const int N = 1e6 + 10;
int a[N], b[N], k, n, sum;
void sovel()
{
	cin >> k >> n;  //k个怪兽   n个所需收集的眼泪
	priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>q;
        
        
        
        
        
        
        
        
                                不杀最后一只怪物
        
        ---------------------------------------------------------------------------
	for (int i = 1; i <= k; i++)  
	{
		cin >> a[i] >> b[i];
		if (i != k)  //如果没有杀最后一只怪兽
		{
			q.push({ a[i],i });  //前面所有的怪兽压入优先队列,待杀
		}
	}
	int manx = 0;
	for (int i = 1; i <= n; i++)  //n滴眼泪
	{
		auto [x, y] = q.top();  
		if (y == -1)  //等于-1就是第二次可以无限杀
		{
			manx += (n - i + 1) * x;  //加上第二次无限杀所需的能量
			break;
		}
		q.pop();    //第一次杀
		manx += x;  //加上第一次杀所花费的能量
		q.push({ b[y],-1 });  //每一只怪兽 要杀第二次的标记为-1
	}












                                  杀最后一只怪物
-----------------------------------------------------------------------------------
	if (n >= k)  //所收集的眼泪数量已经大于等于怪兽的个数,说明每个怪兽至少都杀了一次
	{
		int minx = 1e9;
		for (int i = 1; i <= k; i++)  //对于每个怪兽都有第一次杀和第二次无限杀 ,一共有k个
		{
			sum += a[i];  //加上之前第一次杀的能量
			minx = min(minx, b[i]);  //第二次无限杀的花费的能量取个最小的
		}
		manx = min(manx, sum + minx * (n - k));  //第一次杀 + 第二次杀 所花费的能量和
	}
	cout << manx;

}
signed main()
{
	cin.tie(nullptr)->sync_with_stdio(false);

	int t = 1;
	//	cin>>t;
	while (t--)
	{
		sovel();
	}
}