1. 程式人生 > >2017級演算法模擬上機準備篇(貪心 進階_1)

2017級演算法模擬上機準備篇(貪心 進階_1)

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; }