第十三届蓝桥杯C++B组国赛F题——费用报销 (AC)
创始人
2024-01-18 05:09:49
0

目录

  • 1.费用报销
    • 1.问题描述
    • 2.输入格式
    • 3.输出格式
    • 4.样例输入
    • 5.样例输出
    • 6.数据范围
    • 7.原题链接
  • 2.解题思路
  • 3. AC_code

1.费用报销

1.问题描述

小明在出差结束后返回了公司所在的城市, 在填写差旅报销申请时, 粗心 的小明发现自己弄丢了出差过程中的票据。

为了弥补小明的损失, 公司同意小明用别的票据进行报销, 但是公司财务 要求小明提交的票据中任意两张的日期差不小于 KKK 天, 且总金额不得超过实际 差旅费用 MMM 。

比如财务要求 K=7K=7K=7 时, 若小明提交了一张 1 月 8 日的票据, 小明就不能 提交 1 月 2 日至 1 月 14 日之间的其他票据, 1 月 1 日及之前和 1 月 15 日及之 后的票据则可以提交。

公司的同事们一起给小明凑了 NNN 张票据, 小明现在想要请你帮他整理一 下, 从中选取出符合财务要求的票据, 并使总金额尽可能接近 MMM 。

需要注意, 由于这些票据都是同一年的, 因此 12 月底的票据不会影响到 1 月初票据的提交。这一年不是闰年。

2.输入格式

第 111 行: 3 个整数, N,M,KN, M, KN,M,K
第 2…N+12 \ldots N+12…N+1 行: 每行 3 个整数 mi,di,vim_{i}, d_{i}, v_{i}mi​,di​,vi​, 第 i+1i+1i+1 行表示第 iii 张票据时间 的月份 mim_{i}mi​ 和日期 di,vid_{i}, v_{i}di​,vi​表示该票据的面值

3.输出格式

第 1 行: 1 个整数, 表示小明能够凑出的最大报销金额

4.样例输入

4 16 3
1 1 1
1 3 2
1 4 4
1 6 8

5.样例输出

10

6.数据范围

1≤N≤1000,1≤M≤5000,1≤K≤50,1≤mi≤12,1≤di≤31,1≤vi≤40012,1≤di≤31,1≤vi≤4001≤N≤1000,1≤M≤5000,1≤K≤50,1≤m i≤ 12,1 \leq d_{i} \leq 31,1 \leq v_{i} \leq 40012,1≤di ≤31,1≤vi≤4001≤N≤1000,1≤M≤5000,1≤K≤50,1≤mi≤12,1≤di​≤31,1≤vi​≤40012,1≤di≤31,1≤vi≤400

7.原题链接

费用报销

2.解题思路

这是一道比较明显的01背包问题,涉及物品的选择。这些票据都有月份和天数,为了方便比较,我们将其全部转换为天数,使用pair存下天数和票额,然后根据天数来进行排序。

定义bool数组f[i][j],含义为只考虑前i个物品,能否组成价值为j的情况。当我们枚举到票据i时,假设它的天数为 xxx,如果我们选了票据i,那么票据日期[x−k,x][x-k,x][x−k,x]都是不可取的。所以我们需要使用双指针维护每一个票据i上一个和他日期相差大于k天的票据l

接下来进行状态转移的分析,当j=t[i].secondj>=t[i].secondj>=t[i].second时,说明当前票据我们是可选的,我们有两种抉择——选还是不选?如果我们不选择它,那么转移方程同上。如果我们选择它,那么状态转移时就不一定是从上一个物品转移过来,题意要求两件任意的两张票据需要至少间隔k天,我们应该从上一张比当前票据至少少k天的票据l转移过来,那么状态转移方程为:f[i−1][j]∣f[l][j−t[i].second]f[i-1][j] | f[l][j-t[i].second]f[i−1][j]∣f[l][j−t[i].second]。

将转移方程结合起来,上面是可选状态,下面是不可选状态:
f[i][j]={f[i−1][j]if j=t[i].secodef[i][j]= \begin{cases} f[i-1][j] &\text{if j=t[i].secode}\\ \end{cases}f[i][j]={f[i−1][j]f[i−1][j]∣f[l][j−t[i].second]​if j=t[i].secode​

当然因为是01背包问题,我们也可以使用滚动数组优化,这里为了方便大家理解就没有进行优化。最后从最大体积 MMM 倒着遍历体积 VVV,那么第一个 dp[n][V]=truedp[n][V] = truedp[n][V]=true 对应的 VVV 即为答案。

时间复杂度:O(nm)O(nm)O(nm)。

3. AC_code

#include
using namespace std;
typedef long long LL;
typedef pair PII;;
const int N=1010;int n,m,k;
int w[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
PII t[N];
//只考虑前i个物品能否组成体积为j的情况
bool f[N][5*N];
int main() 
{for(int i=1;i<=12;++i) w[i]+=w[i-1];scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;++i){int a,b,c;scanf("%d%d%d",&a,&b,&c);t[i]={w[a-1]+b,c};}//按日期排序sort(t+1,t+n+1);f[0][0]=true;//双指针int l=0;for(int i=1;i<=n;++i){//找到上一个可选的票据while(t[i].first-t[l+1].first>=k) l++;for(int j=0;j<=m;++j){f[i][j]=f[i-1][j];if(j>=t[i].second) f[i][j]|=f[l][j-t[i].second];}}for(int v=m;v>=0;--v){if(f[n][v]){printf("%d\n",v);return 0;}}
}

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...