2019E0_B Zexal的电影院

怎甘沉沦 提交于 2019-12-02 10:31:10

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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!