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首歌,使听这些歌的快乐程度尽可能的大。
于是,我们想到了两种解决办法:
- 二分
因为这一道题不是某一个数值,而是在集合内选数,所以,我们不能用二分来求解问题了。 - 贪心
我们想到了以下的贪心思路
- 我们把得到的每张票从大到小排序
- 我们把每一个东西依次加入一个优先队列,然后判断:压入当前元素,如果元素个数>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); }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 【基础练习】【字符串】【模拟】洛谷2614 计算器弹琴题解
- PAT-B1011题解
- 2015浙江财经大学ACM有奖周赛(一) 题解报告
- 挑战上的POJ-3617题解
- [LeetCode]题解(python):050-Pow(x, n)
- POJ3080 ZOJ2784 UVALive3628 Blue Jeans题解
- LeetCode题解——Path Sum
- Poj3111【二分】java题解
- LeetCode题解——Evaluate Reverse Polish Notation
- BZOJ3527:[ZJOI2014]力——题解
- LeetCode题解 #8 String to Integer (atoi)
- 【高中组集体赛前热身赛】题解
- LeetCode题解 #2 Add Two Numbers
- 题解:集合运算
- Leetcode题解(九)
- [题解]CLYZ2018省选训(bao)练(zha)模拟赛 Day 8
- 【题解】SWJTU2015.12校队选拔题解
- leetcode题解 NO.1
- 【POJ 2104】K-th Number 题意&题解&代码(c++)
- [洛谷P3948]数据结构 题解(差分)