Codeforces 1140C(貪心+堆)
阿新 • • 發佈:2019-03-23
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(貪心+堆)