1. 程式人生 > >Codeforces 1140C(貪心+堆)

Codeforces 1140C(貪心+堆)

time main ORC math define algorithm clu end line

題面

傳送門

題意:

給出長度為n的序列b,t,定義一個子序列的值為\(\min\{ b_i\} \times \sum t_i\),求所有子序列中值最大的一個,輸出最大值

分析

假如固定某個b[i],則最大值為\(b_i \times \sum t_j (b_j\geq b_i)\),且t[j]為所有滿足條件的t[j]中最大的k個

貪心,先按b[i]從大到小排序

然後從左到右掃描一遍,維護一個最小堆,堆裏存儲最大的k個數

每次把t[i]插入,如果堆的大小超過k就彈出堆頂,然後更新答案

代碼

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#define maxn 300005
using namespace std;
struct node{
    int len;
    int beu;
    friend bool operator < (node p,node q){
        return p.beu>q.beu;
    }
}a[maxn];
priority_queue<int,vector<int>,greater<int> >h;
int n,k;
int main(){
    scanf("%d %d",&n,&k);
    for(int i=1;i<=n;i++){
        scanf("%d %d",&a[i].len,&a[i].beu);
    }
    sort(a+1,a+1+n);
    long long sum=0,ans=0; 
    for(int i=1;i<=n;i++){
        h.push(a[i].len);
        sum+=a[i].len; 
        while(h.size()>k){
            sum-=h.top();
            h.pop();
        }
        ans=max(ans,sum*a[i].beu);
    }
    printf("%I64d\n",ans);
}

Codeforces 1140C(貪心+堆)