(上海站icpc)Steadily Growing Steam(动态规划)

news/2023/12/9 10:14:12

题目链接:登录—专业IT笔试面试备考平台_牛客网

简化题意:就是给你n张牌,然后每张牌有一个点数和一个价值,然后你可以对其中k张牌修改将其点数扩大一倍,当然修改的牌数也可以小于k,然后你将这n张牌选出其中一部分放入两个集合,使得每个集合的牌的点数和相等,然后求满足这样条件的两个集合内部的最大价值和。

分析:其实看到这道题一开始很容易想到令f[i][j][k]表示第一个集合和第二个集合内的牌的点数分别为i和j且当前已经用的修改次数为k时的集合最大价值和,但是很容易发现数组开不了这么大,于是换成构造两者差值,令f[i][j][k]表示考虑前i个商品且当前集合A点数和比集合B点数和多j且已经用了k次修改机会的集合最大价值和由于集合B也有可能比集合A点数大导致j为负值,所以我们有必要给数组第二维加一个偏移量,考虑每张牌的最大点数为13,且均可能翻倍,也就是每张牌的最大点数为26,共有100张牌,也就是2600,所以偏移量应设置为2600,这样第二维就变成了5200,但是这样写完代码后发现会超时,所以我们需要继续优化,这里我们优化的方法类似于剪枝,不妨思考一下,假如我们当前集合A比集合B点数和高了1300及以上,那么代表A内的集合点数已经大于了1300,那么剩余所有的牌均加入B集合也不可能使得集合A和集合B点数相同了,也就是说我们剩下部分的更新是无意义的,所以我们就可以将偏移量设置为1300,这样我们就可以通过了

具体更新过程:

对于每个状态f[i][j][k],我们进行如下考虑:

首先我们考虑不加入第i张牌,那么就有f[i][k][j]=f[i-1][k][j]

我们考虑第i张牌的点数v[i]:

如果k大于2*v[i],也就是我们把第i张牌的点数使用一次翻倍再加入B集合

如果k大于v[i],也就是我们直接把第i张牌加入B集合

如果k+2*v[i]<=2600,这种情况我们就可以把第i张牌使用一次翻倍后加入A集合

如果k+v[i]<=2600,这种情况我们就可以直接把第i张牌加入A集合

于是就有了下面的动态转移方程:

for(int i=1;i<=n;i++)for(int j=0;j<=m;j++)for(int k=0;k<=2600;k++){f[i][k][j]=f[i-1][k][j];if(k>=2*v[i]&&j>=1)f[i][k][j]=max(f[i][k][j],f[i-1][k-2*v[i]][j-1]+w[i]);if(k>=v[i])f[i][k][j]=max(f[i][k][j],f[i-1][k-v[i]][j]+w[i]);if(k+2*v[i]<=2600&&j>=1)f[i][k][j]=max(f[i][k][j],f[i-1][k+2*v[i]][j-1]+w[i]);if(k+v[i]<=2600)f[i][k][j]=max(f[i][k][j],f[i-1][k+v[i]][j]+w[i]);}

最后我再说一下初始化,一定需要注意的是初始化f数组时一定不能初始化为0,因为牌的权值有负值,所以我们应该设置为负无穷大,否则就只能通过87%的样例

下面是代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
const int N=103;
typedef long long ll;
ll f[N][3003][N],w[N],v[N];
int main()
{memset(f,-0x3f,sizeof f);f[0][1300][0]=0;int n,m;cin>>n>>m;for(int i=1;i<=n;i++)scanf("%lld%lld",&w[i],&v[i]);for(int i=1;i<=n;i++)for(int j=0;j<=m;j++)for(int k=0;k<=2600;k++){f[i][k][j]=f[i-1][k][j];if(k>=2*v[i]&&j>=1)f[i][k][j]=max(f[i][k][j],f[i-1][k-2*v[i]][j-1]+w[i]);if(k>=v[i])f[i][k][j]=max(f[i][k][j],f[i-1][k-v[i]][j]+w[i]);if(k+2*v[i]<=2600&&j>=1)f[i][k][j]=max(f[i][k][j],f[i-1][k+2*v[i]][j-1]+w[i]);if(k+v[i]<=2600)f[i][k][j]=max(f[i][k][j],f[i-1][k+v[i]][j]+w[i]);}ll ans=-0x3f3f3f3f;for(int i=0;i<=m;i++)ans=max(ans,f[n][1300][i]);cout<<ans;return 0;
}


http://www.ppmy.cn/news/673823.html

相关文章

xp系统steam无法连接到更新服务器,教你win10系统steam更新失败的解决教程

steam是全球最大的游戏平台之一&#xff0c;它为广大游戏爱好者提供了游戏下载、购买、更新、讨论等多种功能&#xff0c;可是有时候会出现steam无法下载和更新不了的问题&#xff0c;怎么办?就此问题&#xff0c;小编整理了win10系统steam更新失败的解决教程&#xff0c;现分…

gmod无法连接更新服务器未响应,steam gmod更新不动 | 手游网游页游攻略大全

发布时间&#xff1a;2015-09-13 Dota2最近一直频繁更新,而且更新一次都是好几十兆或者几百兆,中国网速普遍比较坑爹,真实让人恼火,关键近期很多玩家都遇见dota2更新不动和dota2更新位于下载队列中的情况,更是对这款游戏产生了绝望的心情,下面小编给 ... 标签&#xff1a; 游戏…

dota2 服务器尚未更新到最新版本,dota2更新不动_steam dota2更新不动

DOTA2更新不动 不能更新 更新一直暂停怎么办 问题解决方法: 1.在安装路径里找到 :\\Dota2\\SteamApps\\common\\dota2beta\\ 然后会看到一个叫dota_lv的文件夹,删掉它,如果不放心可以自行备份! 然后再新建一个文件夹,取名dota_lv,dota_lv然后右键这个文件夹,在属性栏中将…

steam在ubuntu22.04上不更新

使用移动宽带&#xff0c;今天安装了linux版steam&#xff0c;更新不了&#xff1a; 最后把dns改为9.9.9.9正常更新&#xff1a; 设置>网络 改完关一下网络再打开&#xff0c;如图就对了

steam无法正常更新解决办法

请用腾讯网游加速器和Steam一起使用。 ------------------------------------我是分割线------------------------------------------------------ 2021年11月9日&#xff0c;发现腾讯网游加速器不支持steam了&#xff0c;建议科学上网解决。

小程序data-*的误区

场景&#xff1a;点击按钮获取data-*的值跳转页面&#xff0c;跳转页获取传过来的参数 binnie: 华哥&#xff0c;为什么有的部分参数传不过去然后显示undefined&#xff1f; 华哥&#xff1a; binnie, 我看了一下你的代码&#xff0c;你错在属性名有大写字母了。我给你写了个…

明明加了唯一索引,为什么还是产生了重复数据?

前言 前段时间我踩过一个坑&#xff1a;在mysql8的一张innodb引擎的表中&#xff0c;加了唯一索引&#xff0c;但最后发现数据竟然还是重复了。 到底怎么回事呢&#xff1f; 本文通过一次踩坑经历&#xff0c;聊聊唯一索引&#xff0c;一些有意思的知识点。 1.还原问题现场 …

《意志力》

意志力 - 关注于专注&#xff0c;自控与效率的心理学 作者&#xff1a;【美】罗伊 鲍迈斯特 约翰 蒂尔尼 翻译&#xff1a;丁丹 引言&#xff1a; 意志的回归 心理学从不缺乏优秀理论&#xff0c;人们喜欢认为心理学的发展多亏了某些思想家惊人的新见解&#xff0c;事实不是如此…

2019年伯克利大学 CS294-112《深度强化学习》第1讲:课程介绍和概览(笔记)

这里是CS294-112深度强化学习课程&#xff0c;我的名字叫Sergey Levine是这门课的授课老师&#xff0c;材料会放在课程主页&#xff1a;http://rail.eecs.berkeley.edu/deeprlcourse 这是一门高级研究生课程&#xff0c;课程是针对那些准备在深度学习和强化学习领域做研究的学…

《游戏设计理论》参考版

《游戏设计理论》参考版 2005.07.07 来自&#xff1a;gemares  共有评论(0)条 发表评论 收藏 前 言 自从我编著第一本书The Art Computer Game Design 即(《计算机游戏设计艺术》)以来&#xff0c;20年的时间已经过去了。这段时间发生的变化很大&#xff1a;游戏业已…

前端小白必备快捷键工具合集

“工欲善其事&#xff0c;必先利其器。” 初入职场&#xff0c;深刻认识到作为一个程序员&#xff0c;掌握必备的快捷工具及快捷键是一堂必修课&#xff0c;也是提高开发工作效率的不二法门。本文从快捷开发工具及快捷键两方面为前端入门选手量身定做&#xff0c;打造属于你自…

《当下的启蒙》的概述和精华

看完《当下的启蒙》&#xff0c;我对人类的未来更乐观了。 虽然我知道&#xff0c;摩根豪泽尔说过&#xff1a; “悲观主义者的话听起来像是一种善意的劝告&#xff0c;而乐观主义者的话听起来则像是在兜售私货。” 但是&#xff0c;闪开&#xff01;让我尽情歌颂人类的进步和未…

IT大学生成长周报 | 第 6 期

文章目录 IT大学生成长周报&#xff08;第 6 期&#xff09;编程语言看一遍就理解&#xff1a;零拷贝详解还在用策略模式解决 if-else&#xff1f;Map函数式接口方法才是YYDS&#xff01;深入理解CPU的调度原理最强最全面的大数据SQL面试题和答案使用MQ的时候&#xff0c;怎么确…

第1章 程序设计和C语言

所谓程序&#xff0c;就是一组计算机能识别和执行的指令&#xff0c;每一条指令使计算机执行特定的操作。只要让计算机执行这个程序&#xff0c;计算机就会“自动地”执行各条指令&#xff0c;有条不紊地进行工作。 机器语言&#xff1a;计算机工作基于二进制&#xff0c;根本…

洽洽:百亿路上无“鲜”事

【潮汐商业评论/原创】 热衷于探索各种新零食口味的Samantha最近发现&#xff0c;零食界好像刮起了一阵“饭风”。各种零食的口味都逐渐餐饮化了起来&#xff0c;下至老坛酸菜鱼味、香辣小龙虾味、螺蛳粉味&#xff0c;上至醇香黑松露味、西班牙火腿味&#xff0c;琳琅满目。 …

【视频文稿】车载Android应用开发与分析 - AIDL实践与封装(下)

本期视频地址 &#xff1a;https://www.bilibili.com/video/BV1zh4y1x7KE/ 上期视频讲解了AIDL的简单使用&#xff0c;以及5个可能在使用AIDL过程会遇到的问题&#xff0c;本期视频我们继续把余下的5个的问题讲完。 「1. AIDL 进阶」 问题 6&#xff1a;「服务端」向「客户端…

01_ElasticSearch学习笔记

ElasticSearch搜索引擎 文章目录 ElasticSearch搜索引擎学习目标1.ElasticSearche1.1 全文检索1.2 索引结构1.3 ElasticSearch1.3.1 ElasticSearch介绍 1.4 使用postman操作索引库1.4.1 新建文档1.4.2 查询文档 1.5 映射和数据类型1.5.1 字符串类型1.5.2 整数类型1.5.3 浮点类型…

ElasticSearch详解

为什么要使用全文检索 面对复杂的搜索业务和数据量&#xff0c;使用传统数据库搜索就显得力不从心&#xff0c;一般我们都会使用全文检索技术。 常见的全文检索技术有 Lucene、solr 、elasticsearch 等。 索引结构 下图是ElasticSearch的索引结构&#xff0c;下边黑色部分是物…

大型电商架构亿级流量电商详情页系统--实战 缓存同步,热点key统计 降级

35 我们之前的三十讲&#xff0c;主要是在讲解redis如何支撑海量数据、高并发读写、高可用服务的架构&#xff0c;redis架构 redis架构&#xff0c;在我们的真正类似商品详情页读高并发的系统中&#xff0c;redis就是底层的缓存存储的支持 从这一讲开始&#xff0c;我们正式…

win系统中打印机驱动点击打开,没反应的解释

不少小伙伴&#xff0c;私信咨询我&#xff0c;win系统中&#xff0c;打印机的驱动&#xff0c;打不开&#xff0c;是什么原因&#xff1f; 在此&#xff0c;跟大家分析下 这种现象&#xff0c;多属于win10和win11出现&#xff0c;其他版本&#xff0c;例如win7就很少出现这种…
最新文章