设为首页 加入收藏

TOP

BZOJ 1672 Usaco 2005 Dec Cleaning Shifts 清理牛棚 动态规划
2015-07-20 17:34:20 来源: 作者: 【 】 浏览:2
Tags:BZOJ 1672 Usaco 2005 Dec Cleaning Shifts 清理 牛棚 动态 规划

题目大意:有一些牛,他们的牛舍需要被打扫。有N(N <= 10000)头牛愿意打扫,从时间S到时间T,需要花费一些金钱。问若要每时每刻都有牛在打扫,至少需要花多少钱。


思路:1w的数据量不算很大,再加上时限5s,就n^2动归来做。

将牛按时间段的开始排序。

设f[i]为若取第i头牛打扫,到这头牛结束的时间最小花费是多少。

则 f[i] = min(f[i],f[j] + cost[i]) (f[i].st <= f[j].ed + 1)

最后是初值和答案的问题。由于题目中说每时每刻都有牛在打扫,所以f的初值为极大值,在要求开始之前就开始了的牛的初值是这个牛的花费。

动归时更新答案,若要求结束的时候这头牛还在工作,那么就用这头牛更新答案。最后输出答案。


CODE:


#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #define MAX 10010 #define INF 0x3f3f3f3f using namespace std; struct Complex{ int x,y; int cost; bool operator <(const Complex &a)const { if(x != a.x) return x < a.x; return y < a.y; } void Read() { scanf("%d%d%d",&x,&y,&cost); x++,y++; } }src[MAX]; int cnt,st,ed; int f[MAX]; int main() { cin >> cnt >> st >> ed; st++,ed++; for(int i = 1;i <= cnt; ++i) src[i].Read(); sort(src + 1,src + cnt + 1); memset(f,0x3f,sizeof(f)); int ans = INF; for(int i = 1;i <= cnt; ++i) if(src[i].x <= st) f[i] = src[i].cost; for(int i = 1;i <= cnt; ++i) for(int j = 0;j < i; ++j) if(src[i].x <= src[j].y + 1) { f[i] = min(f[i],f[j] + src[i].cost); if(src[i].y >= ed) ans = min(ans,f[i]); } if(ans == INF) ans = -1; cout << ans << endl; return 0; }
     
    
   
  


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU 1829 && POJ 2492 A .. 下一篇Maximal Rectangle

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)
·Redis配置中`require (2025-12-26 03:18:58)
·Asus Armoury Crate (2025-12-26 02:52:33)
·WindowsFX (LinuxFX) (2025-12-26 02:52:30)