5.兽之泪【算法赛】 - 蓝桥云课 (lanqiao.cn)
#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();
}
}