(以下默认$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. 地心地固坐标系(ECEF)与站心坐标系(ENU)的转换

    目录 1. 概述 2. 原理 2.1. 平移 2.2. 旋转 2.3. 总结 3. 实现 4. 参考 1. 概述 我在<大地经纬度坐标与地心地固坐标的的转换>这篇文章中已经论述了地心坐标系 ...

  2. Java基础之(一):JDK的安装以及Notepad++的下载

    从今天开始就开始我的Java的学习了,学习Java前需要做一些前期的准备工作.好了,现在我们先一起来安装JDK. JDK的安装 JDK下载链接:JDK 下载电脑对应的版本,同意协议 双击安装JDK 将 ...

  3. 前段之BOM ----DOM

    一.介绍 BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进行"对话". DOM (Document Object ...

  4. spoj839 Optimal Marks(最小割,dinic)

    题目大意: 给你一个无向图\(G(V,E)\). 每个顶点都有一个int范围内的整数的标记. 不同的顶点可能有相同的标记. 对于边\((u,v)\),我们定义\(Cost(u,v)=mark [u]\ ...

  5. Dapr 虚拟机集群部署 (非K8S)

    从2021-10-08号发布4小时Dapr + .NET 5 + K8S实战到今天刚刚一周时间,报名人数到了230人,QQ群人数从80人增加到了260人左右,大家对Dapr的关注度再一次得到了验证,并 ...

  6. 2020.12.3--vj个人赛补题

    A Vasya studies music.He has learned lots of interesting stuff. For example, he knows that there are ...

  7. Python中pymongo find 遍历数据导致timeout

    背景 在读取大约200W左右的数据的时候采用游标形式进行数据遍历时,超过10分钟就报错 timeout 原因 pymongo游标会在10分钟之后被关闭 解决方案 db.find({}, no_curs ...

  8. VS Code Just My Code Debugging

    VS Code Just My Code Debugging VS Code for C++ doesn't support Just My Code Refer here: Add support ...

  9. javascript-jquery-更改jquery对象

    在许多情况下,jquery代码所做的事情变成了:生成jquery对象A,操作对jquery象A:更改为jquery对象B,操作jquery对象B:更改为jqueryC,操作jquery对象C..... ...

  10. UltraSoft - Beta - Scrum Meeting 11

    Date: May 27th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 记录会议 Liuzh 前端 增加了对重复日程的支持 Kkkk 前端 测试验证前后端 ...