题意:n个曲子,ti时长,bi乐趣,最多选k首,得到使sum(ti)*min(bi)最大。
题解:bi排序,从大到小枚举,使当前bi为最小bi,从大于bi的曲子中选前k-1大。
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+7;
typedef pair<int,int> pii;
typedef long long LL;
pii a[N];
multiset<int>se;
int main()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i].second>>a[i].first;
//ti bi
}
sort(a+1,a+n+1);
LL sum=0,ans=0;
for(int i=n;i>=1;i--)
{
ans=max(ans,1LL*a[i].first*(a[i].second+sum));
se.insert(a[i].second);
sum=sum+a[i].second;
if(se.size()==k)
{
sum=sum-*(se.begin());
se.erase(se.begin());
}
}
cout<<ans;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+7;
typedef pair<int,int> pii;
typedef long long LL;
pii a[N];
priority_queue<int,vector<int>,greater<int> >q;
int main()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i].second>>a[i].first;
//ti bi
}
sort(a+1,a+n+1);
LL sum=0,ans=0;
for(int i=n;i>=1;i--)
{
ans=max(ans,1LL*a[i].first*(a[i].second+sum));
q.push(a[i].second);
sum=sum+a[i].second;
if(q.size()==k)
{
sum=sum-q.top();
q.pop();
}
}
cout<<ans;
return 0;
}