您的位置:首页 > 其它

CodeForces1140C-题解

2020-04-05 12:15 78 查看

题目描述

你有一个有nnn首歌曲的播放列表,第iii首歌有tit_iti​和bib_ibi​两个特征——分别是它的长度和好听程度。

听这些歌的快乐程度等于这些歌的总长度乘他们中的最小的好听程度。举个例子,听三首长度为[5,7,4][5,7,4][5,7,4]而美丽程度为[11,14,6][11,14,6][11,14,6]的歌曲获得的快乐程度等于(5+7+4)∗6=96(5+7+4)*6=96(5+7+4)∗6=96。

你需要从你的播放列表中选出最多kkk首歌,使听这些歌的快乐程度尽可能的大。

输入格式

第一行输入nnn和kkk(1<=k<=n<=3∗1051<=k<=n<=3 * 10^51<=k<=n<=3∗105)两个整数——分别是播放列表中歌的数量和你最多选的歌的数量。

下面的nnn行,每行包含两个整数tit_iti​和比(1<=ti,bi<=1061<=t_i,b_i<=10^61<=ti​,bi​<=106)——第iii首歌的长度和好听程度。

输出格式

输出一个整数——最大的可能快乐程度。

输入 输出
4 3 4 7 15 1 3 6 6 84\ 3\ 4\ 7\ 15\ 1\ 3\ 6\ 6\ 84 3 4 7 15 1 3 6 6 8 787878
5 3 12 31 112 4 100 100 13 55 55 505\ 3\ 12\ 31\ 112\ 4\ 100\ 100\ 13\ 55\ 55\ 505 3 12 31 112 4 100 100 13 55 55 50 100001000010000

样例解释

在第一个测试用例中,我们可以选择歌曲1,3,4{1,3,4}1,3,4,因此总的乐趣是(4+3+6)⋅6=78(4+3+6)⋅6=78(4+3+6)⋅6=78
在第二个测试用例中,我们可以选择歌曲 333。总快乐将等于100⋅100=10000100⋅100=10000100⋅100=10000

这到题有一些思维难度。

Part 1Part\ 1Part 1

我们看到了这句话:你需要从你的播放列表中选出最多kkk首歌,使听这些歌的快乐程度尽可能的大。
于是,我们想到了两种解决办法:

  • 二分
    因为这一道题不是某一个数值,而是在集合内选数,所以,我们不能用二分来求解问题了。
  • 贪心
    我们想到了以下的贪心思路
  1. 我们把得到的每张票从大到小排序
  2. 我们把每一个东西依次加入一个优先队列,然后判断:压入当前元素,如果元素个数>k>k>k,那么sumsumsum减去最小元素,弹出最小元素。

Part 2Part\ 2Part 2

Talk is cheap,show me the code!
以下是完整代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 3e5 + 10;
inline int read()
{
int x = 0, f = 1; char c = getchar();
while (c<'0' || c>'9') { if (c == '-')f = -1; else f = 1; c = getchar(); }
while (c >= '0' && c <= '9') { x = (x << 1) + (x << 3) + (c ^ 48); c = getchar(); }
return x * f;
}
inline void write(int x)
{
if (x > 9)write(x / 10);
putchar(x % 10 + 48);
}
int n, k, sum, ans;
struct node
{
int t, b;
const bool operator>(const node x)const{return b > x.b;}
}s[maxn];
priority_queue<int> q;
signed main()
{
n = read(); k = read();
for (int i = 0; i < n; i++)
s[i].t = read(), s[i].b = read();
sort(s, s + n, greater<node>());
for (int i = 0; i < n; i++)
{
sum += s[i].t;
q.push(-s[i].t);
if (q.size() > k)	sum += q.top(),q.pop();
ans = max(ans, sum * s[i].b);
}
write(ans);
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
凌海逸_墨宇 发布了5 篇原创文章 · 获赞 0 · 访问量 70 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: