列表

详情


NC54633. [CSP2019]纪念品

描述

已替换官方数据
小伟突然获得一种超能力,他知道未来 T 天 N 种纪念品每天的价格。某个纪念品 的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量。
 每天,小伟可以进行以下两种交易无限次: 
  1. 任选一个纪念品,若手上有足够金币,以当日价格购买该纪念品;
  2. 卖出持有的任意一个纪念品,以当日价格换回金币。
 每天卖出纪念品换回的金币可以立即用于购买纪念品,当日购买的纪念品也可以当日卖出换回金币。当然,一直持有纪念品也是可以的。 
T 天之后,小伟的超能力消失。因此他一定会在第 T 天卖出所有纪念品换回金币。 
小伟现在有 M 枚金币,他想要在超能力消失后拥有尽可能多的金币。 

输入描述

第一行包含三个正整数 T,N,M,相邻两数之间以一个空格分开,分别代表未来天数 T,纪念品数量 N,小伟现在拥有的金币数量 M。 
接下来 T 行,每行包含 N 个正整数,相邻两数之间以一个空格分隔。第 𝑖 行的 N 个正整数分别为 , , ,,其中 表示第 𝑖 天第 𝑗 种纪念品的价格。

输出描述

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

示例1

输入:

6 1 100 
50 
20 
25 
20 
25 
50

输出:

305

说明:

最佳策略是:
第二天花光所有 100 枚金币买入 5 个纪念品 1;
第三天卖出 5 个纪念品 1,获得金币 125 枚;
第四天买入 6 个纪念品 1,剩余 5 枚金币;
第六天必须卖出所有纪念品换回 300 枚金币,第四天剩余 5 枚金币,共 305 枚金币。
超能力消失后,小伟最多拥有 305 枚金币

示例2

输入:

3 3 100 
10 20 15 
15 17 13 
15 25 16

输出:

217

说明:

最佳策略是:
第一天花光所有金币买入 10 个纪念品 1;
第二天卖出全部纪念品 1 得到 150 枚金币并买入 8 个纪念品 2 和 1 个纪念品 3,剩 余 1 枚金币;
第三天必须卖出所有纪念品换回216 枚金币,第二天剩余1枚金币,共 217 枚金币。
超能力消失后,小伟最多拥有 217 枚金币。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 24ms, 内存消耗: 480K, 提交时间: 2020-10-25 20:54:18

#include<bits/stdc++.h>
using namespace std;
int t,n,m,i=1,j,k,a[101][101],f[10001];
int main()
{
	cin>>t>>n>>m;
	for(;i<=t;i++)
	    for(j=1;j<=n;j++)
	        cin>>a[i][j];
	for(i=1;i<t;i++)
	{
		memset(f,0,sizeof f);
		for(j=1;j<=n;j++)
		    for(k=a[i][j];k<=m;k++)
		        f[k]=max(f[k],f[k-a[i][j]]+a[i+1][j]-a[i][j]);
		m+=f[m];
	}cout<<m;
}

C++14(g++5.4) 解法, 执行用时: 28ms, 内存消耗: 632K, 提交时间: 2020-10-09 08:58:58

#include<bits/stdc++.h>
using namespace std;
int t,n,m,i=1,j,k,a[101][101],f[10001];
main() 
{
	cin>>t>>n>>m;
	for(;i<=t;i++)
	    for(j=1;j<=n;j++)
		    cin>>a[i][j];
	for(i=1;i<t;i++)
	{
		memset(f,0,sizeof f);
		for(j=1;j<=n;j++)
		    for(k=a[i][j];k<=m;k++)
		        f[k]=max(f[k],f[k-a[i][j]]+a[i+1][j]-a[i][j]);
		m=f[m]+m;
	}cout<<m;
}

上一题