【题面】
【题解】
题意:给定n首歌的播放时长ti和魅力值bi,选择不超过k的x首歌,听歌的总愉悦度=x首歌的时长之和*x首歌中最小的魅力值,输出最大可能愉悦度。
思路:显然我们要先按魅力值排序,从最高魅力值开始选。因为要选择不超过k首歌且我们的选择顺序导致之前被选的歌曲的魅力值一定大于现在的魅力值,因此当x>k时,我们优先把已选中的歌曲中时长最短的歌曲删去。在这过程中不断更新最大答案即可。
pair的sort默认排序:先按first的键值升序排序,若first的键值相等,则按second的键值升序排序。
优先队列默认降序排序。
【代码】
#include <bits/stdc++.h>
using namespace std;
#define ll long long
pair <int,int> a[300005];
priority_queue <int> q;
main()
{
int n,k; scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d%d",&a[i].second,&a[i].first);
sort(a,a+n);
ll sum=0,ans=0;
for(int i=n;i>=0;i--){
sum+=a[i].second;
q.push(-a[i].second);
if(q.size()>k){
sum+=q.top();
q.pop();
}
ans=max(ans,sum*a[i].first);
}
printf("%I64d",ans);
}