Milking Time POJ

来源:互联网 发布:c语言while是什么意思 编辑:程序博客网 时间:2024/06/08 04:04

题意: 总共 N 小时 , M 个产奶时段, 每次产奶后需要休息  R 小时。

    给你 M 组数据, 每组数据 包括 :时段的开始时间点, 结束时间点, 时间段产奶量。

思路: 将所有时间段 按 结束时间点 从小到大 排序。

              dp[i] 是以 第 i 个时间段结束时的最大产奶量 (排序后),有点像最大序列和,不过需要考虑两个时间的休息时段,即 j 时间段 发生后 i 时间段 能否发生。

             for(i=1; i<=m; i++) // 不断 更新 dp[i] 的最优值 
{
dp[i] = c[i].v; 

 for(j=1; j<i; j++) // 和前面的比较(更新后) 更新dp[i]  
 {
   if((c[j].e+r) <= c[i].s) // 如果 j  时间段 发生后 i 时间段 能发生, 则更新 dp[i]
   dp[i] = max(dp[i],dp[j]+c[i].v);      
 }
 
  if(dp[i] > ans)
    ans = dp[i]; // 记录最大值结果 
   } 

#include <iostream>#include <cstdio>#include <cstring>using namespace std;typedef struct worktime{int s, e, v;}WT;WT c[2010];int dp[1010];int main(){      int i, j, n, m, r;      scanf("%d %d %d",&n,&m,&r);      for(i=1;i<=m;i++)       {         scanf("%d %d %d",&c[i].s,&c[i].e,&c[i].v);   }  for(i=1; i<m; i++)  for(j=i+1; j<=m; j++)  {        if(c[i].e > c[j].e)           {           WT temp;              temp = c[i];c[i] = c[j];    c[j] = temp;}  }memset(dp,0,sizeof(dp));                int ans = -1;        for(i=1; i<=m; i++) // 不断 更新 dp[i] 的最优值 {dp[i] = c[i].v;   for(j=1; j<i; j++) // 和前面的比较(更新后) 更新dp[i]    {    if((c[j].e+r) <= c[i].s)     dp[i] = max(dp[i],dp[j]+c[i].v);         }     if(dp[i] > ans)     ans = dp[i]; // 记录最大值结果     }       printf("%d",ans);  return 0; }


原创粉丝点击