蓝桥杯每日真题 - 第19天

题目:(费用报销)

题目描述(13届 C&C++ B组F题)

 

解题思路:

1. 问题抽象

本问题可以看作一个限制条件较多的优化问题,核心是如何在金额和时间约束下选择最优方案

  • 动态规划是理想的解决方法。

  • 我们定义 dp[i]到第 i 天为止的最大报销金额

2. 日期统一化

为了方便处理时间差,需将日期(月份和天数)统一转化为一年中的第几天。例如:

  • 1 月 1 日为第 1 天;

  • 2 月 1 日为第 32 天(31+1)。

这一步能让日期差的计算简单且高效。

3. 动态规划状态转移

  • 状态表示dp[i] 表示到第 i 天为止的最大报销金额。

  • 转移方程:对每张票据:

    • 如果报销当前票据:dp[i] = max(dp[i-1], dp[pre] + v[i]),其中 pre = i - K

    • 如果不报销当前票据:dp[i] = dp[i-1]

4. 优化思路

  • 按票据日期排序,确保动态规划时的时间顺序正确。

  • 动态更新 dp 数组,逐步累积最大金额。

代码实现(C语言):

#include <stdio.h>
#include <stdlib.h>typedef struct {int day, v;
} dps;int N, M, K;
int m[1009], d[1009];
dps dp[1009];
int a[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int p[366] = {0};// 计算每月对应的天数累计和
int month(int mi) {int sum = 0;for (int i = 0; i < mi - 1; i++) sum += a[i];return sum;
}// 将日期统一成一年中的第几天
void becomeday() {for (int i = 0; i < N; i++) {dp[i].day = month(m[i]) + d[i];p[dp[i].day] = dp[i].v;}
}// 比较函数,用于qsort排序
int cmp(const void *a1, const void *a2) {dps s1 = *(dps *)a1;dps s2 = *(dps *)a2;return s1.day - s2.day;
}int main() {scanf("%d%d%d", &N, &M, &K);for (int i = 0; i < N; i++) {scanf("%d%d%d", &m[i], &d[i], &dp[i].v);}// 转换日期并排序becomeday();qsort(dp, N, sizeof(dp[0]), cmp);// 动态规划for (int i = 1; i < 366; i++) {int pre = i - K >= 0 ? i - K : 0;if (p[i] + p[pre] <= M) {p[i] = p[i] + p[pre] > p[i - 1] ? p[i] + p[pre] : p[i - 1];} else {p[i] = p[i - 1];}}printf("%d", p[365]);return 0;
}

得到运行结果:

难度分析

⭐️⭐️⭐️⭐️⭐️难难难难难难

总结

本题核心在于将日期处理动态规划相结合,解决了多条件限制下的最优选择问题。
以下是总结要点:

  1. 日期统一化:通过天数累计简化日期差值计算。

  2. 动态规划核心:记录每一天的最大报销金额,并逐步更新。

  3. 代码结构清晰:日期处理、排序和动态规划分模块实现,方便理解和维护。

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

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

相关文章

数据结构及算法--排序篇

在 C 语言中&#xff0c;可以通过嵌套循环和比较运算符来实现常见的排序算法&#xff0c;比如冒泡排序、选择排序或插入排序 目录 基础算法&#xff1a; 1.冒泡排序&#xff08;Bubble Sort&#xff09; 2.选择排序&#xff08;Selection Sort&#xff09; 3.插入排序&…

科研实验室的数字化转型:Spring Boot系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理实验室管理系统的相关信息成为必然。开发合…

【Redis】持久化机制RDB与AOF

一、RDB RDB模式是就是将内存中的数据存储到磁盘中&#xff0c;等到连接断开的时候会进行持久化操作。但是如果服务器宕机&#xff0c;会导致这个持久化机制不会执行&#xff0c;但是内存中的文件会直接丢失。所以可以设置一个触发机制&#xff0c;save 60 1000 就是代表60秒 执…

Excel——宏教程(精简版)

一、宏的简介 1、什么是宏&#xff1f; Excel宏是一种自动化工具&#xff0c;它允许用户录制一系列操作并将其转换为VBA(Visual Basic for Applications)代码。这样&#xff0c;用户可以在需要时执行这些操作&#xff0c;以自动化Excel任务。 2、宏的优点 我们可以利用宏来…

【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段

文章目录 一、MyBatis-Plus简介二、快速入门1、环境准备2、将mybatis项目改造成mybatis-plus项目&#xff08;1&#xff09;引入MybatisPlus依赖&#xff0c;代替MyBatis依赖&#xff08;2&#xff09;配置Mapper包扫描路径&#xff08;3&#xff09;定义Mapper接口并继承BaseM…

Git 多仓库提交用户信息动态设置

Git 多仓库提交用户信息动态设置 原文地址&#xff1a;dddhl.cn 前言 在日常开发中&#xff0c;我们可能需要同时管理多个远程仓库&#xff08;如 GitHub、Gitee、GitLab&#xff09;&#xff0c;而每个仓库使用不同的邮箱和用户名。比如&#xff0c;GitHub 和 Gitee 使用相…

【spring】spring单例模式与锁对象作用域的分析

前言&#xff1a;spring默认是单例模式&#xff0c;这句话大家应该都不陌生&#xff1b;因为绝大多数都是使用单例模式&#xff0c;避免了某些问题&#xff0c;可能导致对某些场景缺乏思考。本文通过结合lock锁将单例模式、静态变量、锁对象等知识点串联起来。 文章目录 synchr…

Cyberchef使用功能之-多种压缩/解压缩操作对比

cyberchef的compression操作大类中有大量的压缩和解压缩操作&#xff0c;每种操作的功能和区别是什么&#xff0c;本章将进行讲解&#xff0c;作为我的专栏《Cyberchef 从入门到精通教程》中的一篇&#xff0c;详见这里。 关于文件格式和压缩算法的理论部分在之前的文章《压缩…

Elasticsearch开启认证及kibana密码登陆

Elasticsearch不允许root用户运行,使用root用户为其创建一个用户es,为用户es配置密码,并切换到es用户。 adduser elastic passwd elastic su elasticElasticsearch(简称ES)是一个基于Lucene的搜索服务器。它提供了一个分布式、多用户能力的全文搜索引擎,基于RESTful web…

C++初阶学习第十一弹——list的用法和模拟实现

目录 一、list的使用 二.list的模拟实现 三.总结 一、list的使用 list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向 其前一个元素和后一个元素。 常见的list的函数的使用 std::list<int> It {1,…

Postman之安装及汉化基本使用介绍

系列文章目录 1.Postman之安装及汉化基本使用介绍 2.Postman之变量操作 3.Postman之数据提取 4.Postman之pm.test断言操作 5.Postman之newman Postman之安装及汉化 1.安装及汉化postman2.基本使用介绍2.1.基本功能&#xff1a;2.2.编辑、查看、设置环境、全局、集合变量2.3.复制…

VUE 指令 事件绑定,.stop阻止冒泡

1、VUE 的模板语法和指令 目的增强html的功能 所有的指令以自定义属性的方式去写 v-xxx ,指令就是vue提供给我们能够更方便将数据和页面展示出来的操作&#xff0c;具体就是以数据去驱动DOM ,简化DOM操作的行为。 2、内容渲染指令 ① {{}} 模板渲染&#xff08;模板引擎&am…

Android Java 中Lambda 表达式

学习笔记 在 Java 和 Android 中&#xff0c;除了你提到的 setOnClickListener() 使用 Lambda 表达式和匿名类的写法&#xff0c;还有许多类似的场景可以通过 Lambda 表达式来简化代码。以下是一些常见的类似用法以及它们如何通过 Lambda 表达式和匿名类实现。 1. setOnClick…

Android 文件分段上传和下载方案

一、背景 Android 中的大文件下载需要使用分段下载&#xff0c;下载通常是在线程中进行的&#xff0c;假如有5段&#xff0c;那同时5个线程去执行下载&#xff0c;请求http返回文件流后&#xff0c;需要将多个文件流同时写进同一个文件&#xff0c;这里用到 RandomAccessFile…

算法.图论-习题全集(Updating)

文章目录 本节设置的意义并查集篇并查集简介以及常见技巧并查集板子(洛谷)情侣牵手问题相似的字符串组岛屿数量(并查集做法)省份数量移除最多的同行或同列石头最大的人工岛找出知晓秘密的所有专家 建图及其拓扑排序篇链式前向星建图板子课程表 本节设置的意义 主要就是为了复习…

易语言学习-cnblog

易语言数据类型 数值转换命令&#xff08;自己学&#xff09; 数值到大写&#xff08;&#xff09;将一个数值转换到中文读法&#xff0c;第二个参数为是否为简体。 数值到大写&#xff08;123.44&#xff0c;假&#xff09; 猜测结果 数值到金额&#xff08;&#xff09;将双…

atob()为啥明明表示base64toASCII却叫atob?(2)

上篇谈到JavaScript中的atob()函数实际是表示ASCII to binary而非ASCII to base64&#xff0c;那既然函数底层产生的是二进制内容&#xff0c;那为什么咱们在JavaScript环境中通过atob()解码可以直接得到字符串&#xff1f;答案下文揭晓ෆ( ˶ᵕ˶)ෆ 在JavaScript中&#x…

树莓派的开机自启

前言 很多比赛你的装置是不能动的,就是你直接拿上去,不允许用电脑启动. 树莓派开机自启的三种方式 1,快捷方式自启动 就是在我们用户的目录下(他这里是/home/pi,我的是/home/zw),ctrlh可以显示隐藏文件价, #没有就找你自己的用户目录 cd /.config#在这里面建一个autostart文…

Day10_CSS过度动画

Day10_CSS过度动画 背景 : PC和APP项目我们已经开发完毕, 但是再真正开发的时候有些有些简易的动态效果我们可以使用CSS完成 ; 本节课我们来使用CSS完成基础的动画效果 今日学习目标 CSS3过度CSS3平面动态效果CSS3动画效果案例 1. CSS3过渡 ​ 含义 :过渡指的是元素从一种…

vue3-基于element-plus实现定制化动态表单及校验

基础版 这里不会对表单进行封装处理 <template><div style="margin: 0 auto; width: 1200px"><el-formref="formRef"style="max-width: 600px; margin-top: 20px":model="dynamicValidateForm"label-width="auto…