题意:给一堆歌的集合,每首歌有长度和价值,求最多选k首歌的情况下,所有选的歌的长度*其中最小的价值的最大值。
思路:对每首歌按价值大小从大到小排序,保证每次选择时,当前的价值是集合中最小的。
struct node
{
int t, b;
bool operator<(const node b)const
{
if (this->b == b.b)return this->t > b.t;
return this->b > b.b;
}
}e[N];
int main()
{
int n, k;
cin >> n >> k;
f(i, 1, n)
{
scanf("%d%d", &e[i].t, &e[i].b);
}
sort(e + 1, e + 1 + n);
ll ans = 0;
ll sum = 0;
multiset<int> st;
f(i, 1, n)
{
sum += e[i].t;
st.insert(e[i].t);
if (st.size() > k)
{
sum -= *st.begin();
st.erase(st.begin());
}
ans = max(ans, sum*e[i].b);
}
cout << ans << endl;
return 0;
}