(以下默认$A_{0},D_{0},P_{0},K_{0}$都为非负整数)

显然存活轮数$S=\lceil\frac{H_{0}}{C_{p}\max(A_{1}-D_{0},1)}\rceil$​​​是一个关键的变量,且根据数论分块其仅有$o(\sqrt{H_{0}})$​​​种取值,不妨利用数论分块直接$o(\sqrt{H_{0}})$​​枚举,进而也可以确定$D_{0}$​​​​​​(取对应的最小值即可)

(上取整的数论分块实际上即将$H_{0}-1$即可)

进一步的,有以下结论:存在一种取到最值的方案,满足$A_{0}=0$​​或$A_{0}=N'$​​​

关于证明,考虑再枚举这$S$​​轮中物理攻击和魔法攻击的轮数,即$S_{p}$​​和$S_{m}$​​(其中$S_{p}+S_{m}=S$​​)

接下来,考虑如何分配物理攻击和魔法攻击的点数,令$F_{p}(x)$​和$F_{m}(x)$​分别为给物理攻击和魔法攻击分配$x$​​​点的最大伤害值,显然有
$$
\begin{cases}F_{p}(x)=C_{p}S_{p}\max(x-D_{1},1)\\F_{m}(x)=C_{m}\begin{cases}\lfloor\frac{x}{2}\rfloor(x-\lfloor\frac{x}{2}\rfloor)&(\lfloor\frac{x}{2}\rfloor\le S_{m})\\S_{m}(x-S_{m})&(\lfloor\frac{x}{2}\rfloor>S_{m})\end{cases}\end{cases}
$$
最终答案即求$F(x)=F_{p}(x)+F_{m}(N'-x)$在$x\in [0,N']$的最大值,不难证明$F_{p}$和$F_{m}$都是下凸的,进而将$F_{m}$翻转后和$F_{p}$求和仍是下凸的,也即$F$是下凸的

同时,下凸函数的最大值显然在端点处取到,即$x=0$​​或$x=N'$​​,显然$x$也即$A_{0}$​,结论得证

通过这个结论,对两类分别讨论:

1.若$A_{0}=0$​,考虑再枚举$K_{0}$​,答案即​​
$$
\begin{cases}C_{p}(S-K_{0})+C_{m}K_{0}(N'-K_{0})&(K_{0}<S)\\C_{m}S(N'-K_{0})&( K_{0}\ge S)\end{cases}
$$
(为了保证魔法攻击不劣于物理攻击,可以令$K_{0}<N'$,但实际上也会在下面的情况中考虑)​​

即是一个关于$K_{0}$​​的分段一次和二次函数, 不难求极值

2.若$A_{0}=N'$​​​,显然全部使用物理攻击,答案即$C_{p}S\max(A_{0}-D_{1},1)$​​

由于有$t$组数据,最终总复杂度为$o(t\sqrt{H_{0}})$​,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define ll long long
4 int t,Cp,Cm,H0,A1,D1,n;
5 ll ans;
6 ll f(ll a,ll b,ll c,int x){
7 return a*x*x+b*x+c;
8 }
9 ll get_max(ll a,ll b,ll c,int l,int r){
10 ll pos=-b/(a<<1),ans=max(f(a,b,c,l),f(a,b,c,r));
11 if ((l<=pos)&&(pos<=r))ans=max(ans,f(a,b,c,pos));
12 if ((l<=pos+1)&&(pos+1<=r))ans=max(ans,f(a,b,c,pos+1));
13 return ans;
14 }
15 int main(){
16 scanf("%d",&t);
17 while (t--){
18 scanf("%d%d%d%d%d%d",&Cp,&Cm,&H0,&A1,&D1,&n);
19 ans=0;
20 for(int i=1,j;i<=A1;i=j+1){
21 if (i>=H0)j=A1;
22 else j=min((H0-1)/((H0-1)/i),A1);
23 int S=((H0+i-1)/i+Cp-1)/Cp,D0=A1-j,nn=n-D0;
24 if (nn<0)continue;
25 if (min(nn,S)>1)ans=max(ans,get_max(-Cm,(ll)Cm*nn-Cp,(ll)Cp*S,1,min(nn,S)-1));
26 if (S<nn)ans=max(ans,(ll)Cm*S*(nn-S));
27 ans=max(ans,(ll)Cp*S*max(nn-D1,1));
28 }
29 printf("%lld\n",ans);
30 }
31 return 0;
32 }

[hdu7026]Might and Magic的更多相关文章

  1. Codeforces CF#628 Education 8 D. Magic Numbers

    D. Magic Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  2. [8.3] Magic Index

    A magic index in an array A[0...n-1] is defined to be an index such that A[i] = i. Given a sorted ar ...

  3. Python魔术方法-Magic Method

    介绍 在Python中,所有以"__"双下划线包起来的方法,都统称为"Magic Method",例如类的初始化方法 __init__ ,Python中所有的魔 ...

  4. 【Codeforces717F】Heroes of Making Magic III 线段树 + 找规律

    F. Heroes of Making Magic III time limit per test:3 seconds memory limit per test:256 megabytes inpu ...

  5. 2016中国大学生程序设计竞赛 - 网络选拔赛 C. Magic boy Bi Luo with his excited tree

    Magic boy Bi Luo with his excited tree Problem Description Bi Luo is a magic boy, he also has a migi ...

  6. 一个快速double转int的方法(利用magic number)

    代码: int i = *reinterpret_cast<int*>(&(d += 6755399441055744.0)); 知识点: 1.reinterpret_cast&l ...

  7. MAGIC XPA最新版本Magic xpa 2.4c Release Notes

    New Features, Feature Enhancements and Behavior ChangesSubforms – Behavior Change for Unsupported Ta ...

  8. Magic xpa 2.5发布 Magic xpa 2.5 Release Notes

    Magic xpa 2.5發佈 Magic xpa 2.5 Release Notes Magic xpa 2.5 Release NotesNew Features, Feature Enhance ...

  9. How Spring Boot Autoconfiguration Magic Works--转

    原文地址:https://dzone.com/articles/how-springboot-autoconfiguration-magic-works In my previous post &qu ...

随机推荐

  1. try catch中的return与finally

    try catch中的return与finally 代码为 public class Test{ public int add(int a,int b){ try { return a+b; } ca ...

  2. oracle扩展表空间

    1.  查看表空间的名字及文件所在的位置 select tablespace_name, file_id, file_name, round(bytes / (1024 * 1024), 0) tot ...

  3. yum源安装nginx

    nginx使用yum源安装 安装步骤 使用yum源安装依赖 yum install yum-utils 配置nginx.repo的yum文件 vim /etc/yum.repos.d/nginx.re ...

  4. 一文了解MySQL性能测试及调优中的死锁处理方法,你还看不明白?

    一文了解MySQL性能测试及调优中的死锁处理方法,你还看不明白? 以下从死锁检测.死锁避免.死锁解决3个方面来探讨如何对MySQL死锁问题进行性能调优. 死锁检测 通过SQL语句查询锁表相关信息: ( ...

  5. Python中的sys.stdin和input、sys.stdout与print--附带讲解剑指offer42-连续子数组的最大和

    2020秋招季,终于开始刷第一套真题了,整套试卷就一道编程题,还是剑指offer上的原题,结果答案死活不对,最后干脆直接提交答案算了,看了下别人的答案,原来是输入数据没有获取的原因,不过这个语法sys ...

  6. Golang通脉之类型定义

    自定义类型 在Go语言中有一些基本的数据类型,如string.整型.浮点型.布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型. type是Go语法里的重要而且常用的关键字,type绝 ...

  7. Vue接收后端传过来excel表格的文件流并下载

    题外话:当接收文件流时要确定文件流的类型,但也有例外就是application/octet-stream类型,主要是只用来下载的类型,这个类型简单理解意思就是通用类型类似 var .object.ar ...

  8. webpack基础以及webpack中babel的配置

    webpack 安装 npm 初始化,控制台输入 npm init -y webpack 安装 npm i webpack webpack-cli -D 新建 webpack.config.js co ...

  9. CSP/S 2020 退役记

    上一次的AFO记 上上次的AFO记 Day -INF 一条咸鱼的垂死挣扎. RP+=INF Day 0 出发辣. 早上来到机房,带上了准备的面包和泡面....然而后来嫌太占地方就没拿...草了. 而且 ...

  10. 一张图彻底搞懂Spring循环依赖

    1 什么是循环依赖? 如下图所示: BeanA类依赖了BeanB类,同时BeanB类又依赖了BeanA类.这种依赖关系形成了一个闭环,我们把这种依赖关系就称之为循环依赖.同理,再如下图的情况: 上图中 ...