CF1989D Smithing Skill 题解
这篇题解是我在赛场上的真实思路,所以可能会比较冗长。但是相较于其他题解,读者可以在这篇题解中理解为什么会想到使用动态规划。我认为,授人以鱼不如授人以渔,理解为什么想到使用动态规划,比知道使用动态规划更重要。
首先,有一个比较显然的贪心。每次合成之后立即融掉,可以获得 \(2\) 点技能点,并失去材料 \(a_i-b_i\) 个。因此,我们把所有合成方式按照 \(a_i-b_i\) 升序排序,先合成消耗少的合成方式,再合成消耗多的合成方式。
考虑到需要 \(a_i\) 个材料才能合成,若 \(a_i-b_i\) 相等,我们采用 \(a_i\) 较小的合成方式,这样就可以合成更多次。不难发现如果一种合成方式 \(a_i-b_i\) 大于等于其他合成方式,并且 \(a_i\) 大于等于其他合成方式,这种合成方式一定不优,可以舍去。于是,现在的合成方式序列满足若 \(i\lt j\),则 \(a_i-b_i\lt a_j-b_j\) 且 \(a_i\gt a_j\)。对于某种数量 \(c\),最优的合成方式显然是满足 \(a_i\le c\) 的编号最小的位置。
每种材料互相独立,分别处理。首先考虑如何使用最优的一种合成方式进行合成。我们先留下 \(a_i\) 个材料,并对于剩下的材料进行合成,每次消耗 \(a_i-b_i\) 个,利用除法直接算出。这样就保证了至少有 \(a_i\) 个材料,一定可以合成。之后,我们求出合成后的余数,加到留下的 \(a_i\) 个中,然后暴力计算。显然,这个计算的次数不会太多,大概 \(0\sim1\) 次,可以看作常数。
根据数据范围,使用最优的一种合成方式进行合成后,剩余的材料数量不会超过 \(10^6\),考虑预处理。设 \(f[i]\) 表示剩余 \(i\) 个材料可以合成并融化的最多次数,我们发现,无论对于哪一个 \(i\),进行一部分操作之后,\(i\) 只会变小而不会变大。也就是说,如果从小到大枚举 \(i\),\(f[i]\) 的求解仅依赖于之前的状态,可以动态规划。
从小到大枚举 \(i\),我们发现,经过第一步的处理后,可以使用的最优的一种合成方式也在从编号大到编号小单调递减,可以直接维护。使用最优的一种合成方式进行合成,就可以直接将剩余的材料数量可以合成并融化的最多次数通过状态累加过来。于是,我们就在线性时间内预处理出了 \(f[i]\)。
最后,思维变得很明朗。如果 \(c\le10^6\),直接查表得到 \(f[c]\)。否则,使用最优的一种合成方式进行合成后,再查表累加进答案。
使用桶排序,时间复杂度为 \(O(n)\),非常优秀。
#include <bits/stdc++.h>
using namespace std;
long long t,n,m,c,a[1500000],b[1500000],s[1500000],q[1500000],p[1500000],f[1500000],cnt=0,now=0,ans=0;
inline long long read()
{
long long x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int main()
{
for(int i=0;i<=1000000;i++)s[i]=1e9;
n=read(),m=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<=n;i++)b[i]=read();
for(int i=1;i<=n;i++)s[a[i]-b[i]]=min(s[a[i]-b[i]],a[i]);
cnt=0,q[cnt]=1e9,p[cnt]=0;
for(int i=1;i<=1000000;i++)
if(s[i]<q[cnt])q[++cnt]=s[i],p[cnt]=i;
now=cnt;
for(int i=1;i<=1000000;i++)
{
while(q[now]<=i&&now>0)now--;
if(now<cnt)now++;
else continue;
c=i,f[i]+=(c-q[now])/p[now];
c=(c-q[now])%p[now]+q[now];
while(c>=q[now])c-=p[now],f[i]++;
f[i]+=f[c];
}
for(int i=1;i<=m;i++)
{
c=read();
if(c<q[1])
{
ans+=f[c];
continue;
}
ans+=(c-q[1])/p[1];
c=(c-q[1])%p[1]+q[1];
while(c>=q[1])c-=p[1],ans++;
ans+=f[c];
}
printf("%lld\n",ans*2);
return 0;
}
CF1989D Smithing Skill 题解的更多相关文章
- [模拟赛FJOI Easy Round #2][T3 skill] (最小割+最大权闭合子图(文理分科模型))
[题目描述] 天上红绯在游戏中扮演敏剑,对于高攻击低防御的职业来说,爆发力显得非常重要,为此,她准备学习n个技能,每个技能都有2个学习方向:物理攻击和魔法攻击.对于第i个技能,如果选择物理攻击方向,会 ...
- AtCoder Beginner Contest 089完整题解
A - Grouping 2 Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement There a ...
- HDU 4352 XHXJ's LIS HDU 题解
题目 #define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefully reading the ent ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- 【转】What is an SDET? Part 2 – Skill Matrix of SDET
What is an SDET? Part 2 ---- Skill Matrix of SDET (Instead of naming it as part 2 of What is an SDET ...
随机推荐
- java一个校验对象是否为null的豪华大礼包
自写的校验所有类型是否为null的工具类, 懒人福音,嘎嘎好用. 1 /** 2 * 一个校验对象是否为null的豪华大礼包 3 * 可以校验:Collection,Map,String,Enumer ...
- flowable任务监听器和java-service依赖注入问题
前言 1. Flowable中Java服务任务的依赖注入方法,比如使用Spring的@Autowired或构造函数注入,并确保服务任务类由Spring管理. 2. 流程引擎配置中启用依赖注入和表达式解 ...
- 使用PyMuPDF对pdf文件插入文字时 遇到配置本地的字体文件缺仍然使用默认Helvetica字体问题
背景 昨天收到的新需求,一份文件从其他部门发起,进行一些文字填写后盖章,再到我们部门,我们接收到的是pdf文件,所以需要在pdf文件中进行修改,插入当日日期等文字.但有要求字体必须和原文档字体相同. ...
- Java高效合并Excel报表实战:GcExcel让数据处理更简单
前言:为什么需要自动化合并Excel? 在日常办公场景中,Excel报表合并是数据分析的基础操作.根据2023年企业办公效率报告显示: 财务人员平均每周花费6.2小时在Excel合并操作上 人工合并的 ...
- JDK的SPI有什么缺陷?dubbo做了什么改进?
JDK的SPI机制的缺点 ⽂件中的所有类都会被加载且被实例化.这样也就导致获取某个实现类的方式不够灵活,只能通过 Iterator 形式获取,不能根据某个参数来获取对应的实现类.如果不想用某些实现类, ...
- PhpStorm - 本地动态调试-下载配置xdebug扩展
PhpStorm - 本地动态调试-下载配置xdebug扩展 00x01 查看phpinfo <?php phpinfo(); 00x02下载扩展前查看Architecture 如果Archit ...
- 揭秘AI自动化框架Browser-use(终):利用MCP与Spring AI,3行代码复刻Browser-use实现
技术背景与目标 在前几篇文章中,我们深入解析了Browser-use框架的核心机制,包括DOM树遍历与分析.提示词构造.任务分解与规划.以及浏览器操作的函数调用.我们将通过Spring AI和Play ...
- 工具 | ysoSimple
0x00 简介 ysoSimple是一款简易的Java漏洞利用工具,集成Java反序列化,Hessian反序列化,XStream反序列化,SnakeYaml反序列化,Shiro550,JSF反序列化, ...
- 成语答题小程序v3.0
自从开源成语答题小程序以来不断完善功能,并且不断修复bug,成语答题小程序v3版本完善了很多功能 1.增加了原生模板广告,设置原生模板广告后可以设置首页或答题页是否显示原生模板广告 2.增加了背景设置 ...
- 经济订货量之"最优经济订货批量和平均存货量和最佳订货次数和订货间隔期和保管费用率"
案例一(最佳订货量) 案例二(最佳订货量+平均存货量) 年需求 = 每周需求*52周 案例三(保管费用率案例和最佳订货量) 保管费用率案例 案例四(最佳订货批量 + 最佳订货次数) 案例五(最佳订货量 ...