首页 > 其他分享 >P8803 [蓝桥杯 2022 国 B] 费用报销

P8803 [蓝桥杯 2022 国 B] 费用报销

时间:2024-05-15 14:42:44浏览次数:23  
标签:ch last P8803 int 31 蓝桥 -- 2022 dp

P8803 [蓝桥杯 2022 国 B] 费用报销

一、问题简析

本题是一道 01背包。重点是 \(K\) 的限制,使我们在取 \(a_i\) 时,不能无所顾忌地套用模板 \(dp_{i-1,j-a_i.worth}+a_i.worth\) 。我们必须找到上一张合法的 \(a_j\),即 \(a_j\) 与 \(a_i\) 之间的日期不小于 \(K\)。

通过以下步骤确定 \(a_j\):

  • 将每张支票的日期转换为天数,并按升序排序
  • 用一个 last[] 数组记录 \(a_i\) 上一张合法的支票的编号
  • 此时,方程变为 \(dp_{i,j}=max(dp_{i-1,j},dp_{last_i,j-a_i.worth}+a_i.worth)\)

二、Code

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

ll quickin(void)
{
	ll ret = 0;
	bool flag = false;
	char ch = getchar();
	while (ch < '0' || ch > '9')
	{
		if (ch == '-')    flag = true;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9' && ch != EOF)
	{
		ret = ret * 10 + ch - '0';
		ch = getchar();
	}
	if (flag)    ret = -ret;
	return ret;
}

typedef pair<int, int> P;    // first -- 日期转换为天数; second -- 价值 
const int MAX = 1e3 + 5;
int N, M, K, last[MAX];
P A[MAX];
int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int psum[15], dp[5010][5010];

bool cmp(const P &a, const P &b)
{
	return a.first < b.first;
}

int main()
{
	#ifdef LOCAL
	freopen("test.in", "r", stdin);
	#endif
	
	psum[0] = 0;
	for (int i = 1; i <= 12; ++i)
		psum[i] = psum[i - 1] + days[i]; // psum[i] -- 1月到i月有几天 
	
	N = quickin(), M = quickin(), K = quickin();
	for (int i = 1; i <= N; ++i)
	{
		int a, b, c;
		a = quickin(), b = quickin(), c = quickin();
		A[i].first = psum[a - 1] + b; // 将日期转换为为天数 
		A[i].second = c;               // 记录票据价值 
	}
	
	sort(A + 1, A + 1 + N, cmp); // 按天数升序排序 
	for (int i = 1; i <= N; ++i)
		for (int j = i - 1; j >= 0; --j)
			if (A[i].first - A[j].first >= K)
			{
				last[i] = j; // last[i] -- 第i张票据上一张合法的票据 
				break;
			}
			
	for (int i = 1; i <= N; ++i)
		for (int j = M; j >= A[i].second; --j)
			dp[i][j] = max(dp[i - 1][j], dp[last[i]][j - A[i].second] + A[i].second);
	
	cout << dp[N][M] << endl;
	
	return 0;
}

标签:ch,last,P8803,int,31,蓝桥,--,2022,dp
From: https://www.cnblogs.com/hoyd/p/18193827

相关文章

  • 广东各高校2023/2022/2021近三年录取分数线(excel文件下载)
    为了帮助考生更好地进行志愿填报,更好的对数据筛选,故整理广东各高校2023/2022/2021三年录取分数excel文件,部分数据及文件见下图,数据根据历年录取分数线汇总,仅供参考,详细请登陆各高校网站查询。如有需要,可根据步骤下载文件:文件列表及数据如下图所示,真实有效。关注上述公众......
  • P9175 [COCI2022-2023#4] Mreža 题解
    P9175[COCI2022-2023#4]Mreža题解前言我发现,有整体二分与主席树的地方总有莫队(不是那个莫队,是那个莫队)。知识点(树上)倍增,(树上)莫队,树状数组(“树”含量满满),分块。题意分析给定一棵树,每条边有一个权值\(v\),以及可以用一个花费\(c\)将它变成更大的权值\(s\)。再给定一......
  • 程序员的AI编程小助手,CodeGeeX在vscode,vs2022,IDEA2023使用体验总结
    程序员的AI编程小助手,CodeGeeX使用体验总结一、1.CodeGeeX是什么?能做什么?CodeGeeX是一个智能编程软件工具,目前CodeGeeX支持多种主流IDE,如VSCode、visualstudio2022,IntelliJIDEA、PyCharm、Vim等,同时,支持Python、Java、C++/C、JavaScript、Go等多种语言。CodeGeeX如何......
  • linux里安装sql2022详细步骤
    https://learn.microsoft.com/zh-tw/sql/linux/quickstart-install-connect-ubuntu?view=sql-server-linux-ver16&preserve-view=true&tabs=ubuntu2004https://learn.microsoft.com/zh-tw/sql/linux/quickstart-install-connect-ubuntu?view=sql-server-linux-ver16&a......
  • 蓝桥杯-日期问题
    小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在1960年1月1日至2059年12月31日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在......
  • 蓝桥杯-移动距离(最简单的写法)
    X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3…当排满一行时,从下一行相邻的楼往反方向排号。比如:当小区排号宽度为6时,开始情形如下:123456121110987131415.....我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移......
  • P9425 [蓝桥杯 2022 国 B] 2022
    一、题目描述将\(2022\)拆分成\(10\)个互不相同的正整数之和,有多少种方案?二、问题简析令\(dp[i][j]=\)\(i\)的\(j\)划分的方案数(满足互不相同的正整数)。有两种实现方式:\(dp[i][j]\)不含\(1\)在\(dp[i-j][j]\)的基础上,每个元素+1。有\(j\)个元素,每个元素+1,......
  • EXP练手:CVE-2022-22963从编写到调试排错
    写什么?之前在使用Spring相关工具时候发现其中漏洞利用模块CVE-2022-22963需要手动利用(2023年的笔记,现在不确认工具是否更新了)GitHub-AabyssZG/SpringBoot-Scan:针对SpringBoot的开源渗透框架,以及Spring相关高危漏洞利用工具于是尝试编写这个exp,对编程不熟悉的可以看看我的Go......
  • 2022广东大学生攻防大赛WP
    MISC复合尝试导出http数据发现文件类型和文件名都被改过把pass.md改为pass.zip,发现打不开添加文件头解压得到Emklyusg=E2=80=82gni=E2=80=82bvvymlag=E2=80=82tsqic=E2=80=82colz=E2=80=82jx=moxvl=E2=80=82tiwhz=E2=80=82ebmee,=E2=80=82Zhjeoig=E2=80=82Krpvpi-Zgvlyv......
  • 第十二届蓝桥杯选拔赛 python
    第一题(难度系数2,18个计分点) 编程实现:输入一个正整数n,计算出n乘100的积。 输入描述:输入一个正整数n输出描述:输出n乘100的积 样例输入:2样例输出:200  第二题(难度系数3,20个计分点) 编程实现:给定一个正整数,判断这个正整......