nyoj 720 项目安排(dp+二分优化)
生活随笔
收集整理的這篇文章主要介紹了
nyoj 720 项目安排(dp+二分优化)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
項目安排
時間限制:3000?ms ?|? 內存限制:65535?KB 難度:4 描述對于每個測試案例,輸入的第一行是一個整數n(1<=n<=5000):代表小明手中的項目個數。
接下來共有n行,每行有3個整數st、ed、val,分別表示項目的開始、截至時間和項目的報酬,相鄰兩數之間用空格隔開。
st、ed、value取值均在32位有符號整數(int)的范圍內,輸入數據保證所有數據的value總和也在int范圍內。
上傳時數據加強,項目起始時間和終止時間可能相同(其他oj可能無此情況)
解題思路:
這個題很想之前做的會場安排問題,利用貪心求解,但這里需要考慮到花費,所以貪心并不能找到最優的。這里采用的是動態規劃的思想,由于每個項目是按照時間來的,所以我們先將項目都按照結束時間排序,相同則按照開始時間小的排序。
首先講下為什么要這么排序,其實這樣是可以幫助我定義狀態,dp[i]表示做完前i個項目所需要的最大價值。如果我們要表示做完這個項目,很明顯的就是要找這個項目做完的時間。接下來就是如何找到在這個項目開始前所做的項目呢?我們可以這么思考,比這個項目更早的時間做完,那么它們的結束時間肯定當前這個項目的開始時間要小,這樣我們就可以找到所有符合要求的項目了。
如果這里用枚舉肯定會超時,可以采用二分優化,因為我們已經將項目排好序了,符合單調性。
只不過這里的提示糾結了好久,它說可能起始時間和終止時間相同,我在想會不會有多個項目是用一個時間段,然后我又想了去重,結果超時了。。最后把去重的函數去掉就A了。。
AC:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std;const int maxn = 5005; struct Node {int st,ed,val;bool operator < (const Node &rhs) const{if(st == rhs.st && ed == rhs.ed) return val > rhs.val;else if(ed == rhs.ed) return st < rhs.st;return ed < rhs.ed;} }p[maxn]; int n,dp[maxn];int search(int l,int r,int key) {int mid,ans = 0;while(l <= r){mid = (l + r) >> 1;if(p[mid].ed <= key){ans = mid;l = mid + 1;}else r = mid - 1;}return ans; }int main() {while(scanf("%d",&n)!=EOF){for(int i = 1; i <= n; i++)scanf("%d %d %d",&p[i].st,&p[i].ed,&p[i].val);sort(p+1,p+1+n);dp[1] = p[1].val;for(int i = 2; i <= n; i++){dp[i] = max(p[i].val,dp[i-1]); //只做這個項目,不做這個項目int k = search(1,i-1,p[i].st);dp[i] = max(dp[i],dp[k] + p[i].val);}printf("%d\n",dp[n]);}return 0; }
總結
以上是生活随笔為你收集整理的nyoj 720 项目安排(dp+二分优化)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JEECG 3.7.8 补丁代码提交通
- 下一篇: JEECG第16期架构培训班15号开班,