Zexal的电影院
题目
知识点:优先队列,排序
Zexal的电影院拿到了n部电影的放映权,每部电影具有两个属性,L(电影的时长),V(电影给观众带来的愉悦值)。看K部电影所带来的愉悦值为K部电影的时长之和乘以K部电影中最小的愉悦值。例如,喜欢看一套3部电影,其时长分别为 [5,7,4]和愉悦度分别为 [11,14,6]那么这一套电影所带来的愉悦值为(5+7+4)∗6=96现在电影院计划最多上映k部不同的电影,那么电影院可以给观众带来的最大愉悦值是多少?
输入
第一行包含两个整数n(1<n<1e5)和K(1<k<1e3) 其中n代表电影院所拥有放映权电影的总数,K代表着可以上映的最大数量。
每个下一个n行包含两个整数Li和Vi(1<Li<1e6,1<Vi<1e6)
输出
电影院可以带给观众的最大的愉悦值
输入样例
4 3
4 7
15 1
3 6
6 8
输出样例
78
样例解释
我们可以选择电影1,3,4,所以最大愉悦值是(4+3+6)∗6=78
思路
控制愉悦值,首先对愉悦值排序。思考新加入一部愉悦值更小的的电影?是否整体愉悦值就会变小?
当我们控制住一个变量时,另一个也是可控的。所以,当我们选取了更小愉悦值额变量时,可以在k+1部电影中去掉时长最短的电影。
Ans = max(oldans,newans)
按愉悦度从大到小排序 从大到小跑一遍愉悦度。随着i的增 加,愉悦度在减少。在愉悦度减少的同时,在保证长度的个数为 k 个的情况下尽可能让长度变长,求得每次愉悦度和长度和的乘积,取最大的那个。
用优先队列维护一下前k长的长度。
代码
#include <cstdlib>
#include <algorithm>
#include <ctime>
#include <iostream>
#include <map>
#include <random>
#include <queue>
#include <cstring>
#include <set>
using namespace std;
typedef long long ll;
const int ms = 300300;
pair<int, int> a[ms];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k;
cin >> n >> k;
for (int i = 0; i < n; ++i)
{
cin >> a[i].second >> a[i].first;
}
sort(a, a + n);
priority_queue<int, vector<int>, greater<>> q;
ll res = 0, sum = 0;
for (int i = n - 1; i >= 0; --i)
{
q.push(a[i].second), sum += a[i].second;
if (q.size() > k)
{
sum -= q.top(); q.pop();
}
res = max(res, a[i].first*sum);
}
cout << res;
return 0;
}
来源:https://blog.csdn.net/weixin_44024733/article/details/102752351