当前位置: 首页 > news >正文

P2889 [USACO07NOV] Milking Time S

题目大意

N N N 个小时可以挤奶。其中有 m m m 个时间段可以给 Bessis 奶牛挤奶。第 i i i 个时间段为 s i s_i si ~ t i t_i ti,可以获得 E f f i Eff_i Effi 滴奶。每次挤完奶后,人都要休息 R R R 小时。最后问,一共能挤出多少滴奶。

双重选择分析

休息 R R R 小时可以归为挤奶时间段内。即,第 i i i 段挤奶的时间段为 s i s_i si ~ t i = t i + R t_i=t_i+R ti=ti+R

设挤奶的最佳方案为:
{ a 1 , a 2 , . . . , a k } \{a_1,a_2,...,a_k\} {a1,a2,...,ak},其中 a i a_i ai 是第 i i i 个挤奶的时间段编号。同时满足 s a 2 ≥ t a 1 s_{a_2}\ge t_{a_1} sa2ta1 s a 3 ≥ t a 2 s_{a_3}\ge t_{a_2} sa3ta2,以此类推。

显然,为了更好的选奶牛,要对奶牛按 t i t_i ti 进行排列。

a k a_k ak 进行双重选择分析:

  • a k = m a_k=m ak=m,方案变为 { a 1 , a 2 , . . . , a k − 1 , m } \{a_1,a_2,...,a_{k-1},m\} {a1,a2,...,ak1,m}方案的属性:

    1. 奶量。原方案的奶量 = 子方案的奶量 + E f f m Eff_m Effm。由于,原方案求的是最大奶量,所以子方案求解的也是最大奶量。
    2. 可以选择的时间段范围。子方案可以选择的范围为 1 ~ m − 1 m-1 m1
    3. 奶牛最大的挤奶结束时间。子方案奶牛最大的挤奶结束时间为 s m s_m sm

    综上,子方案反映的问题为,从 1 ~ m − 1 m-1 m1 个时间段中,挤奶结束时间最大为 s m s_m sm 的最大奶量问题。

  • a k ≠ m a_k≠m ak=m,方案不变。
    方案的属性:

    1. 奶量。原方案的奶量 = 子方案的奶量。
    2. 可以选择的时间段范围。子方案可以选择的范围为 1 ~ m − 1 m-1 m1
    3. 奶牛最大的挤奶结束时间。子方案奶牛最大的挤奶结束时间为 N N N

    综上,子方案反映的问题为,从 1 ~ m − 1 m-1 m1 个时间段中,挤奶结束时间最大为 N N N 的最大奶量问题。

综上,原问题的状态描述为 d p m , N dp_{m,N} dpm,N状态转移式为 d p m , N = max ⁡ ( d p m − 1 , s n + E f f m , d p m − 1 , N ) dp_{m,N} = \max(dp_{m-1,s_n}+Eff_m,dp_{m-1,N}) dpm,N=max(dpm1,sn+Effm,dpm1,N)

将其一般化可得 d p i , j = max ⁡ ( d p i − 1 , s i + E f f i , d p i − 1 , j ) dp_{i,j}=\max(dp_{i-1,s_i}+Eff_i,dp_{i-1,j}) dpi,j=max(dpi1,si+Effi,dpi1,j)需要注意的是:第一种情况只有当 t i ≤ j t_i\le j tij 的时候才成立。

这样做,最终的时间复杂度、空间复杂度都为 O ( n m ) O(nm) O(nm),只能拿到 70 分。

示例程序

#include<iostream>
#include<algorithm>using namespace std;const int N = 1e3 + 10;struct node{int s,t,eff;bool operator < (const node &p)const{return t < p.t;}
}cow[N];int dp[N][N * 100];int main(){int n,m,r;cin >> n >> m >> r;n += r;for(int i = 1; i <= m; i++){cin >> cow[i].s >> cow[i].t >> cow[i].eff;cow[i].t = cow[i].t + r;}sort(cow + 1,cow + m + 1);for(int i = 0; i <= n; i++){if(i >= cow[1].t) dp[1][i] = cow[1].eff;else dp[1][i] = 0;}for(int i = 2; i <= m; i++){for(int j = 0; j <= n; j++){if(j >= cow[i].t){dp[i][j] = dp[i - 1][cow[i].s] + cow[i].eff;}dp[i][j] = max(dp[i][j],dp[i - 1][j]);}}cout << dp[m][n];return 0;
}
http://www.lryc.cn/news/542260.html

相关文章:

  • 基于Spring Boot的健康医院门诊在线挂号系统设与实现(LW+源码+讲解)
  • PyTorch-基础(CUDA、Dataset、transforms、卷积神经网络、VGG16)
  • 复现论文:DPStyler: Dynamic PromptStyler for Source-Free Domain Generalization
  • 6.将cr打包成网络服务|使用postman进行测试|编写oj_server的服务路由功能(C++)
  • 基于SpringBoot + Vue的共享汽车(单车)管理系统设计与实现+毕业论文+开题报告+指导搭建视频
  • Day54(补)【AI思考】-SOA,Web服务以及无状态分步解析与示例说明
  • 回溯算法之组合和排列问题
  • gihub上适合练手的Python项目
  • 解锁CSnakes:.NET与Python的融合魔法
  • Python常见面试题的详解16
  • 建筑兔零基础自学python记录29|实战词云可视化项目——分人物阵营词云(上)7
  • Vi 编辑器基本使用指南
  • 22、《Spring Boot消息队列:RabbitMQ延迟队列与死信队列深度解析》
  • linux 命令+相关配置记录(持续更新...)
  • ssh工具
  • LLM大语言模型私有化部署-使用Dify的工作流编排打造专属AI诗词数据分析师
  • Windows 图形显示驱动开发-WDDM 3.2-自动显示切换(二)
  • 基于CentOS7安装kubesphere和Kubernetes并接入外部ES收集日志
  • 软考教材重点内容 信息安全工程师 第17章 网络安全应急响应技术原理与应用
  • 使用 DeepSeek + OmniParser v2 + UIAutomation 实现 GUI 应用自动化测试的探索
  • Spring Security面试题
  • 从零开始构建基于DeepSeek的智能客服系统
  • Linux故障排查和性能优化面试题及参考答案
  • 【无人集群系列---大疆无人集群技术进展、技术路线与未来发展方向】
  • 【亲测有效】百度Ueditor富文本编辑器添加插入视频、视频不显示、和插入视频后二次编辑视频标签不显示,显示成img标签,二次保存视频被替换问题,解决方案
  • ubuntu windows双系统踩坑
  • 嵌入式八股文(五)硬件电路篇
  • flink使用demo
  • OpenCV(8):图像直方图
  • 力扣LeetCode:1656 设计有序流