题意:
给定长度为n的数组a[i],b[i],选择至多k个元素,使得sum{a[i]}*min(b[i])最大
解析:
贪心
按b[i]降序排列,依次装入计算,求最大的乘积.
贪心规则是每次选择一个已经选到的max(a[x])里最小的删去,加上一个a[i],因为是降序排列所以min(b[])=b[i]
遍历贪心
ac:
#include<bits/stdc++.h>
#define IOS std::ios::sync_with_stdio(false);
#define pb push_back
#define ll long long
#define mod 1000000007
#define per(i,a,b) for(int i=a;i<b;i++)
#define rep(i,a,b) for(int i=a;i>=b;i--)
#define MAXN 300005
using namespace std;
struct node
{
int a,b;
bool friend operator < (node x,node y)
{
return x.b>y.b;
}
}ee[MAXN];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d%d",&ee[i].a,&ee[i].b);
sort(ee,ee+n);
priority_queu