多关键字dp,P1687 机器人小Q

P1687 机器人小Q - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

成功派送完这个大单后,餐厅决定引入一名新成员:机器人小 Q。小 Q 的到来让餐厅的客源增加了不少,但是,一段时间之后,新的问题又出现了,小 Q 和我们可不一样,如果要让他工作的话,我们得给他输入能量以保持体力,而小 Q 的能量菜单表上已经按一定顺序给出了 N 个单位的能量值,但是每个单位的能量由于来源不同,需要消耗一定的时间摄入。已知小 Q 每天充电的时间上限值为 119,如果时间超出的话就会自动崩溃,大家都想让小 Q 留下来,经过研究之后,决定派 HWX 和 XYF 去和老板谈判,考虑角度不一样,LXC 老板才不想听什么辛酸流泪史,他只想知道,若是想让小 Q 获得 k 单位的能量(也就是能量表中可以不接受某些能量)最少需要几天来充电。

输入格式

第一行,两个整数,N,K 分别表示小 Q 的能量菜单上有 N 个单位的能量,想获取其中的 k 个。

第二行,N个整数,分别是第 i 个单位能量需要的充电时间。

输出格式

仅一行,一个整数,为最少需要天数。

如果永远不能达到题目要求,输出 You can't do it.

输入输出样例

输入 #1复制

7 3
1 119 119 1 120 120 118

输出 #1复制

2

说明/提示

样例解释

只接收 1,1,1181。显然这需要 2 天。

数据规模

对于 30% 的数据,有 1≤K≤N≤20。

对于 100% 的数据,有 1≤K≤N≤3000。

解析:


多关键字dp
我们很容易想到将状态划分为 f[i][j] :表示从前 i 个能量中选取 j 个的最小天数;
但我们发现:每天充电上限为 119 这一状态无法体现,即这个划分方式并非不重不漏的,而且这一状态对天数的影响至关重要;
因此我们可以将这个划分方式稍微修改一下,划分为 f[i][j][1] 和 f[i][j][0];
f[i][j][1] 表示表示从前 i 个能量中选取 j 个的最小天数,f[i][j][0] 表示这种情况下的当天消耗的时间;

(即,以天数为第一关键字,以最后一天充电的时长为第二关键字选取最优解)
这样,我们就将整个问题划分成了多个不重不漏的子集
则状态的转移过程为:

f[i−1][j−1][0]+w[i]>119
这时候我们应该增加新的一天来使用第i 个能量单位
因此比较f[i−1][j−1][1]+1 与f[i][j][1] 的大小关系。
若f[i−1][j−1][1]+1<f[i][j][1]
那么此时选取第 i 个能量单位的决策一定优于f[i][j] 的决策
若f[i][j][1]=f[i−1][j−1][1]+1,f[i][j][0]=w[i]
f[i−1][j−1][1]+1=f[i][j][1],那么这时候比较第二关键字
f[i][j][0]=min(w[i],f[i][j][0])

f[i−1][j−1][0]+w[i]≤119
这时候考虑将第
i 个能量单位追加到最后一天内,仍然按序比较两个关键字
若 f[i−1][j−1][1]<f[i][j][1]
此时选取第 i 个能量单位的决策一定优于 f[i][j] 的决策
f[i][j][1]=f[i−1][j−1][1],f[i][j][0]=f[i−1][j−1][0]+w[i]

若f[i−1][j−1][1]=f[i][j][1]
此时比较第二关键字
f[i][j][0]=min(f[i][j][0],f[i−1][j−1][0]+w[i])

如果我们不选取第 i 个能量单位
这时候直接继承前面的状态f[i][j][0]=f[i−1][j][0],f[i][j][1]=f[i−1][j][1]
 

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
using namespace std;
typedef long long LL;
const int N = 3e3 + 5;
int n, m;
int a[N];
int f[N][N][2];int main() {scanf("%d%d", &n, &m);int cnt = 0;for (int i = 1; i <= n; i++) {scanf("%d", &a[++cnt]);if (a[cnt] > 119)cnt--;}n = cnt;if (cnt < m) cout << "You can't do it." << endl;memset(f, 0x3f3f3f3f, sizeof f);for (int i = 0; i <= n; i++) {f[i][0][1] = 0;}for (int i = 1; i <= n; i++) {for (int j = 1; j <= min(i,m); j++) {f[i][j][1] = f[i - 1][j][1];f[i][j][0] = f[i - 1][j][0];if (f[i - 1][j - 1][0] + a[i] > 119) {if (f[i][j][1] > f[i - 1][j - 1][1] + 1) {f[i][j][1] = f[i - 1][j - 1][1] + 1;f[i][j][0] = a[i];}if (f[i][j][1] == f[i - 1][j - 1][1] + 1) {f[i][j][0] = min(f[i][j][0], a[i]);}}else {if (f[i - 1][j - 1][1] < f[i][j][1]) {f[i][j][1] = f[i - 1][j - 1][1];f[i][j][0] = f[i - 1][j - 1][0] + a[i];}if(f[i - 1][j - 1][1] == f[i][j][1]){f[i][j][0] = min(f[i][j][0], f[i - 1][j - 1][0] + a[i]);}}}}cout << f[n][m][1] << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/140128.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【c++随笔12】继承

【c随笔12】继承 一、继承1、继承的概念2、3种继承方式3、父类和子类对象赋值转换4、继承中的作用域——隐藏5、继承与友元6、继承与静态成员 二、继承和子类默认成员函数1、子类构造函数 二、子类拷贝构造函数3、子类的赋值重载4、子类析构函数 三、单继承、多继承、菱形继承1…

设计模式-工厂方法

工厂方法是一种创建型设计模式&#xff0c;其在父类中提供一个创建对象的方法&#xff0c;允许子类决定实例化对象的类型。 问题 假设你开设了一个汽车工厂。创业初期工厂只能生产宝马这一款车&#xff0c;因此大部分代码都位于名为宝马的类中。 工厂效益非常好&#xff0c;为…

IDEA搭建ssm项目

此前&#xff0c;我一直在用eclipse编辑器做java项目&#xff0c;现在初次使用IDEA编辑器&#xff0c;在这里&#xff0c;我记录了使用IDEA环境下搭建ssm项目的过程。 创建Maven项目&#xff0c;如下 右击TEST4项目&#xff0c;在弹出的菜单中选择Add Framework Support 在弹出…

屏幕提词软件Presentation Prompter mac中文版使用方法

Presentation Prompter for mac是一款屏幕提词器软件&#xff0c;它可以将您的Mac电脑快速变成提词器&#xff0c;支持编写或导入&#xff0c;可以在一个或多个屏幕上平滑地滚动&#xff0c;Presentation Prompter 下载是为适用于现场表演者&#xff0c;新闻广播员&#xff0c;…

计算机网络——b站王道考研笔记

第一章 计算机网络体系结构 1.计算机网络概述 &#xff08;1&#xff09;概念 计算机网络是一个将分散的&#xff0c;具有独立功能的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统&#xff1b; 是互连的&#…

数据分析面试题1

1.右表为一组数据&#xff0c;尝试进行简单分析&#xff0c;并给出结论&#xff08;使用公式和图表辅助&#xff09; ①理解数据 userid&#xff1a;用户id神兽印记消耗数量 ②数据清洗 冻结首行&#xff0c;将列标题的英文字段转换成汉字字段检查是否有重复项&#xff1a;…

Leetcode—20.有效的括号【简单】

2023每日刷题&#xff08;二十七&#xff09; Leetcode—20.有效的括号 C实现代码 class Solution { public:bool isValid(string s) {stack<char> arr;int len s.size();if(len 1) {return false;}for(int i 0; i < len; i) {if(s[i] ( || s[i] [ || s[i] {)…

基于springboot实现沁园健身房预约管理系统【项目源码】计算机毕业设计

基于springboot实现沁园健身房预约管理系统演示 B/S架构 B/S结构是目前使用最多的结构模式&#xff0c;它可以使得系统的开发更加的简单&#xff0c;好操作&#xff0c;而且还可以对其进行维护。使用该结构时只需要在计算机中安装数据库&#xff0c;和一些很常用的浏览器就可以…

Flink

1. Flink简介 1.1 初识Flink Flink项目的理念是&#xff1a;“Apache Flink是为分布式、高性能、随时可用以及准确的流处理应用程序打造的开源的有状态的流处理框架”。 Apache Flink是一个框架和分布式处理引擎&#xff0c;用于对无界和有界数据流进行有状态计算。Fl…

进亦忧,退亦忧,Github Copilot 集成进入 Visual Studio 带来的思考

开篇想到《岳阳楼记》的结尾&#xff1a; 不以物喜&#xff0c;不以己悲&#xff1b;居庙堂之高则忧其民&#xff1b;处江湖之远则忧其君。是进亦忧&#xff0c;退亦忧。然则何时而乐耶&#xff1f;其必曰&#xff1a;“先天下之忧而忧&#xff0c;后天下之乐而乐”乎。未来30…

HarmonyOS 高级特性

引言 本章将探讨 HarmonyOS 的高级特性&#xff0c;包括分布式能力、安全机制和性能优化。这些特性可以帮助你构建更强大、更安全、更高效的应用。 目录 HarmonyOS 的分布式能力HarmonyOS 的安全机制HarmonyOS 的性能优化总结 1. HarmonyOS 的分布式能力 HarmonyOS 的分布…

Python 使用tkinter复刻Windows记事本UI和菜单功能(一)

下一篇&#xff1a;Python 使用tkinter复刻Windows记事本UI和菜单&#xff08;二&#xff09;-CSDN博客 介绍&#xff1a; Windows操作系统中自带了一款记事本应用程序&#xff0c;通常用于记录文字信息&#xff0c;具有简单文本编辑功能。Windows的记事本可以新建、打开、保…

html菜单的基本制作

前面写过一点网页菜单的博文&#xff1b;下面再复习一些技术要点&#xff1b; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.…

Python---元组的相关操作方法

由于元组中的数据不允许直接修改&#xff0c;所以其操作方法大部分为查询方法。 编号函数作用1元组[索引]根据索引下标查找元素2index()查找某个数据&#xff0c;如果数据存在返回对应的下标&#xff0c;否则报错&#xff0c;语法和列表、字符串的index方法相同3count()统计某…

基于GPTs个性化定制SCI论文专业翻译器

1. 什么是GPTs GPTs是OpenAI在2023年11月6日开发者大会上发布的重要功能更新&#xff0c;允许用户根据特定需求定制自己的ChatGPT模型。 Introducing GPTs 官方介绍页面https://openai.com/blog/introducing-gpts 在原有自定义ChatGPT的流程中&#xff0c;首先需要自己编制p…

SOME/IP 协议介绍(四)RPC协议规范

RPC协议规范 本章描述了SOME/IP的RPC协议。 传输协议绑定 为了传输不同传输协议的SOME/IP消息&#xff0c;可以使用多种传输协议。SOME/IP目前支持UDP和TCP。它们的绑定在以下章节中进行了解释&#xff0c;而第[SIP_RPC_450页&#xff0c;第36页]节讨论了选择哪种传输协议。…

消息中心常见解决方案分享

解决方案 1、问题2、设计3、流程 看了大部分的消息中心解决方案&#xff0c;发现大家的中心思想都大差不差&#xff0c;区别基本都是在符合自身业务场景的做了一些定制化处理。本文为我对消息中心基本骨架的知识梳理&#xff0c;亦在帮助大家对消息中心设计有一个基本的理解。 …

每日随机一题ctf——web-FlatScience【攻防世界】

文章目录 前言 前言 涉及内容&#xff1a; 使用御剑进行目录扫描 代码审计审计出一个sql注入的点 sql注入 爬取所有文档 提升点&#xff1a; 模仿御剑自己编写一个扫描器 通过网上的资源去学习代码审计 通过网上的资源去学习sql注入 通过网上的资源去学习爬虫技术&#xff08…

Spring 常见面试题

1、Spring概述 1.1、Spring是什么? Spring是一个轻量级Java开发框架,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题Spring最根本的使命是解决企业级应用开发的复杂性&#xff0c;即简化Java开发。这些功能的底层都依赖于它的两个核心特性&#xff0c;也就是…

DaoWiki(基于Django)开发笔记 20231113

DaoWiki&#xff08;基于Django&#xff09;开发笔记 20231113 开发环境 操作系统 windows11python版本 3.12.0django版本 4.2.7 构建python虚拟环境 python -m venv daowiki启动python虚拟环境 cd daowiki\Scripts .\activate安装Django pip install django4.2.7创建项目…