976 AlvinZH想回家(背包DP大作战T)
生活随笔
收集整理的這篇文章主要介紹了
976 AlvinZH想回家(背包DP大作战T)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
976 AlvinZH想回家
思路
如果在第i小時有一些飛機延誤,那么一架飛機的c值越大,這一小時產生的損失也越大。而使這一小時產生的損失盡可能的小并不會導致接下來時間產生的損失增大。因此應當每一小時都找出要飛的飛機中c值最大的飛走,即貪心思想。
題目有要求,第k+i小時,應該從1~k+i架航班中未飛出的航班中選出ci最大的飛走.
由于需要將找出數據中的最大值、去掉數據中最大值,可以考慮使用優先隊列。
貪心證明: 設序號為i的飛機起飛時間為di,則cost=∑(di-i)_ci=∑di_ci-∑i*ci. 顯然后一項為常數,而d(i)為[k+1,k+n]的一個排列,所以只要使ci越大的i盡可能早起飛即可使得cost最小。
可以輸入完之后再處理,見參考代碼一。一般輸入一邊處理,見參考代碼二。思想相同,并無差別。
參考代碼一
// // Created by AlvinZH on 2017/11/6. // Copyright (c) AlvinZH. All rights reserved. //#include <cstdio> #include <queue> using namespace std;struct Flight {int c, id;bool operator<(const Flight& b) const {return c < b.c;} }F[500005], t;int n, k; long long ans; priority_queue<Flight> Q;int main() {while(~scanf("%d%d",&n,&k)){ans = 0;for(int i = 1; i <= n; i++){scanf("%d", &F[i].c);F[i].id = i;}for(int i = 1; i <= k; i++)Q.push(F[i]);for(int i = k+1; i <= k+n; i++){if(i <= n)Q.push(F[i]);t = Q.top();Q.pop();ans += (long long)t.c * (i-t.id);}printf("%lld\n", ans);} }參考代碼二
// // Created by AlvinZH on 2017/11/6. // Copyright (c) AlvinZH. All rights reserved. //#include <cstdio> #include <queue> using namespace std;struct Flight {int c, id;Flight(int c, int id):c(c), id(id) {}bool operator < (const Flight& b) const {return c < b.c;} };int n, k, c; long long ans; Flight F(0,0); priority_queue<Flight> Q;int main() {while(~scanf("%d%d",&n,&k)){ans = 0;for(int i = 1; i <= n + k; i++){if(i <= n){scanf("%d", &F.c);F.id = i;Q.push(F);}if(i >= k+1)//開始處理{F = Q.top();Q.pop();ans += (long long)F.c * (i-F.id);}}printf("%lld\n", ans);} }轉載于:https://www.cnblogs.com/AlvinZH/p/7867616.html
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的976 AlvinZH想回家(背包DP大作战T)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对象属性的可枚举性
- 下一篇: fcntl函数参数F_GETPIPE_S