2017級演算法模擬上機準備篇(貪心 進階_1)
阿新 • • 發佈:2018-12-20
AlvinZH想回家
這道題本質上還是貪心與演算法的簡單的結合,有一個小的trick值的主要一下,結構體優先佇列的運算子過載問題。
bool operator<(const Flight& b) const { return c < b.c; }
對於每一步都需要當前最大值的問題,我們可以使用優先佇列來輔助我們進行操作。
bool operator <(const Time& a,const Time& b){ return a.start > b.start; } //這裡以大於過載小於是因為預設情況下,優先佇列是以大的作為隊首,這樣一反,就可以再預設情況下使得小的作為隊首
struct Time{ int start, end; bool operator < (const Time& t)const{ return start > t.start; } };
#include <iostream> #include <algorithm> #include <cstring> #include <queue> using namespace std; const int maxlen=500010; //不能早於最早的開發時間 那隻需要在每次預定的時間內 選擇延遲費用最高的航班即可struct flight{ int c,id; bool operator < (const flight& b) const{ return c < b.c; } }ar[500005],t; long long ans=0; priority_queue<flight> q; int main(){ //每次都要取當前的最大值 要考慮到優先佇列呀 //結構體優先佇列的操作符號的 重載入 int n,i,j,k; while(~scanf("%d %d",&n,&k)){ ans=0; for(int i=1;i<=n;i++){ scanf("%d",&ar[i].c); ar[i].id=i; } for(i=1;i<=k;i++) q.push(ar[i]); for(int i=k+1;i<=k+n;i++){ if(i<=n) q.push(ar[i]); t=q.top(); q.pop(); ans += (long long)t.c * (i-t.id); } printf("%lld\n",ans); } return 0; }