首页 > 编程语言 >F. 纪念品 - 2023HBUCM程序设计竞赛/CSP-J2019

F. 纪念品 - 2023HBUCM程序设计竞赛/CSP-J2019

时间:2023-12-13 14:56:33浏览次数:40  
标签:小伟 纪念品 int 金币 2023HBUCM 换回 J2019 卖出 CSP

题面

小伟突然获得一种超能力,他知道未来 \(T\) 天 \(N\) 种纪念品每天的价格。某个纪念品的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量。每天,小伟可以进行以下两种交易无限次:

  1. 任选一个纪念品,若手上有足够金币,以当日价格购买该纪念品;
  2. 卖出持有的任意一个纪念品,以当日价格换回金币。 每天卖出纪念品换回的金币可以立即用于购买纪念品,当日购买的纪念品也可以当日卖出换回金币。当然,一直持有纪念品也是可以的。

\(T\) 天之后,小伟的超能力消失。因此他一定会在第 \(T\) 天卖出所有纪念品换回金币。 小伟现在有 \(M\) 枚金币,他想要在超能力消失后拥有尽可能多的金币。

输入

第一行包含三个正整数 \(T,N,M\),相邻两数之间以一个空格分开,分别代表未来天数 \(T\),纪念品数量 \(N\),小伟现在拥有的金币数量 \(M\)。 接下来 \(T\) 行,每行包含 \(N\) 个正整数,相邻两数之间以一个空格分隔。第 \(i\) 行的 \(N\) 个正整数分别为\(P_{i,1}​,P_{i,2}​,……,P_{i,N}\)​,其中 \(P_{i,j}\)​ 表示第 \(i\) 天第 \(j\) 种纪念品的价格。

输出

输出仅一行,包含一个正整数,表示小伟在超能力消失后最多能拥有的金币数量。

题解

有限商品有限金钱,但每天可购入的商品都没有数量限制,一眼完全背包!……然而没写出来orz
纠结点:模板背包题中,物品同时具有两个属性:费用 \(cost\) 和价值 \(value\) ,而这道题中商品费用 = 价值。即使能想到商品的重量就是卖出价值 - 买进价值,但是因为无法确定具体哪一天卖出最佳,思路陷入死循环

本题破题关键点:当日购买的纪念品也可以当日卖出换回金币

这题题面有一句关键的话,“当日购买的纪念品也可以当日卖出换回金币”!这句话可以帮我们简化状态,因为如果一个纪念品,你想连续持有若干天,可以看做第一天买,第二天早上立刻卖掉,然后第二天买回来,第三天早上立刻卖掉,然后第三天买回来……所以我们就不需要记录每天手里持有多少纪念品了,统一认为我们今天买的纪念品,明天早上就立刻卖掉。明天又是新的一天,用所有的现金,进行新的决策就好了。
——P5662 纪念品 题解 - 泥土笨笨

所以本题中,商品的费用即为明天的价值 - 当天的价值,由此建立集合与状态转移方程:
集合:前 \(i\) 天的前 \(j\) 个物品,此时还有 \(k\) 枚金币;
属性:要求最终拥有的最多金币数量,也是能赚到的最大差价,即为最大价值问题。
划分方案:\(price[i][j]\) 表示第 \(i\) 天第 \(j\) 个物品的价格,对于第 \(i\) 天的第 \(j\) 种物品来说,若要,则比起前一天来说的现金少了 \(price[i][j]\) ,但是明天的收益则会多出可赚的差价。
朴素方程:\(f[i][j][k]=max(f[i][j][k],f[i][j-1][k+price[i][j]]+price[i+1][j]-price[i][j])\)

但是本题的数据规模是 \(t<=100,N<=100,M<=10^3\) ,三维数组时间空间都会炸,所以需要优化降维
第一维天数在传递过程中只需要保留当天最大收益即可,所以可以优化掉;
第二维物品的优化参考完全背包问题即可。

#include<bits/stdc++.h>
using namespace std;

const int N = 105;
int t, m, n;
int v[N][N], w[N][N], f[N * N];

int main()
{
	cin >> t >> n >> m;
	for (int i = 1; i <= t; i++) {
		for (int j = 1; j <= n; j++) {
			cin >> v[i][j];
			w[i - 1][j] = v[i][j] - v[i - 1][j];
		}
	}
	for (int d = 1; d < t; d++) {
		memset(f, 0, sizeof f);
		for (int i = 1; i <= n; i++)
			for (int j = v[d][i]; j <= m; j++)
				f[j] = max(f[j], f[j - v[d][i]] + w[d][i]);
		m += f[m];
	}
	cout << m;
}

标签:小伟,纪念品,int,金币,2023HBUCM,换回,J2019,卖出,CSP
From: https://www.cnblogs.com/haruhomu/p/17898002.html

相关文章

  • CSP-J参赛攻略
    试卷详情第一轮试题(CSP-J1&CSP-S1)组成:·试题由3部分组成,满分100分·选择题(共15题,每题2分,共计30分)提高组的前10道题为单选题,后5道题为不定项选择题(只有全部选对才得分,否则不得分);普及组的前15道题都是单选题。·程序理解题(共3题,共计40分)题目给出一段程序(不一定有关于程序功能......
  • D. 相似基因 - 2023HBUCM程序设计竞赛
    题面p哥作为一名湖中医信息工程学院的同学,不仅对信息有兴趣,同时对生物也很有兴趣。相信大家从初高中生生物基本知识都知道,DNA基因可以看作一个碱基对序列。它包含了\(4\)种核苷酸,简记作\(A,C,G,T\)。现在假设想计算两个基因的相似程度,相似度的计算方法如下:对于两个已知基因,......
  • csp2023 第二轮游记
    csp2023第二轮游记Day-1就在自己的学校(而且甚至是我上信息技术课的教室),所以试机了和没试机没有任何区别qwqDay0正序开题,发现T1好像是\(5\)个for循环,然后觉得不对就没写(哭T2放一下赛场代码吧(码风奇怪请勿介意)//game//codeby:fish_szyawa//time:2023/10/2......
  • 【CCFCSP】2209真题笔记
    -1.如此编码分析daisuki代数题了,直接无脑套公式子任务有提示,记得参考测试数据:1532767222222222222222预期结果:111111111111111AC:#include<iostream>usingnamespacestd;constintmaxn=25;intn,m,tmp;inta[maxn],b[maxn];......
  • CSP-J2022逻辑表达式(expr)
    #include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintMAXN=1e6;structnode{   charv;   intl,r;};vector<node>g(MAXN);intbuild_tree(stringsl){   intlast=1;   stack<int>st;   for(inti=0;i<......
  • 【luogu帖】CSP-J 2023 模拟赛 01 赛时答疑帖
    赛时禁止用户与他人交流比赛相关内容,禁止在答疑帖发其他无关内容。欢迎大家参与CSP-J2023模拟赛01。这里是本场比赛的答疑帖。我向各位参赛者及谷友们的支持表示感谢。请不要在赛前在本帖中发布过多灌水相关言论,赛时禁止在本帖中发布灌水相关言论。如果对题面有不理解建议......
  • 【CCFCSP】2212真题笔记
    -1.现值计算分析做第一题避免用vector,会把简单问题复杂化普通数组或者哈希映射就足够解决问题了微微微模拟,题目有公式ans(-14.059)=(-200)x(1.05^0)+100x(1.05^-1)+100x(1.05^-2)测试数据:20.05-200100100AC:#include<bits/stdc++.h>usingnamespacestd......
  • CSP-J2023公路
    原题:【23CSPJ普及组】公路(road)题解:题目提供2个特殊性质,通过这两个性质可以考虑问题的解决方案。特殊性质A:站点 1的油价最低。由于题目没有限制邮箱的大小,所以就只要在1站点加能恰好开完全程的油就可以了。获分(15分)特殊性质B: 由于各个站点的距离恰好是整数升油所能走......
  • csp2023 第一轮游记
    csp2023第一轮游记Day-20AFO.Day0考试是周六,所以还是正常在学校上课,除了有点担心,还是有点担心(主要是没复习)。考前打了一个代码:#include<bits/stdc++.h>usingnamespacestd;intrp;intmain(){ for(inti=1;;i++) { rp++; printf("%d\n",rp); } re......
  • 【CCFCSP】2303真题笔记
    -1.田地丈量分析测试数据4101000555-2153881515-210315UNAC:情况不完全max,min就是很好用#include<bits/stdc++.h>usingnamespacestd;intmain(){intn,a,b;cin>>n>>a>>b;longlongarea;while(n--){intx1......