题目链接:
https://vjudge.net/problem/POJ-3616
题目大意:
在一个农场里,在长度为N个时间可以挤奶,但只能挤M次,且每挤一次就要休息t分钟;
接下来给m组数据表示挤奶的时间与奶量求最大挤奶量
思路:
dp[i]表示完成第i个任务的挤奶量,之后的所有区间左端点大于等于休息之后的时间的任务,都需要更新
1 #include<iostream> 2 #include<vector> 3 #include<queue> 4 #include<algorithm> 5 #include<cstring> 6 #include<cstdio> 7 #include<set> 8 #include<map> 9 #include<cmath> 10 #include<sstream> 11 using namespace std; 12 typedef pair<int, int> Pair; 13 typedef long long ll; 14 const int INF = 0x3f3f3f3f; 15 int T, n, m,d; 16 const int maxn = 1e3 + 10; 17 struct node 18 { 19 int x, y, num; 20 bool operator < (const node & a)const 21 { 22 return x < a.x || x == a.x && y < a.y; 23 } 24 }a[maxn]; 25 int dp[maxn];//dp[i]表示前i次挤奶中的最大量 26 int main() 27 { 28 cin >> n >> m >> d; 29 for(int i = 0; i < m; i++) 30 { 31 scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].num); 32 } 33 sort(a, a + m); 34 for(int i = 0; i < m; i++) 35 { 36 dp[i] += a[i].num; 37 int start = a[i].y + d; 38 for(int j = i + 1; j < m; j++) 39 { 40 if(a[j].x >= start) 41 dp[j] = max(dp[j], dp[i]); 42 } 43 } 44 int ans = 0; 45 for(int i = 0; i < m; i++)ans = max(ans, dp[i]); 46 cout<<ans<<endl; 47 return 0; 48 }