题目链接

这道题做了有一阵了,之前一直不知道是什么问题,今天又回头看了看,试了试精度,发现之前的如果末尾是5会无法进位,改完之后就对了。。。精度真的是玄学问题,这个问题一定要重视,还是要积累一些经验。

一道模拟题,题目看着很复杂,值的确是有点多,不过仔细读读发现其实要关注的并不多,可以精简为以下几个值。
1物理输出 由于护甲减少的是比例减少,所以被动技能加成也是直接乘以物理输出即可,所以那些攻击力护甲值什么的直接计算出物理输出。
2血量和最大血量 生命值,很重要,如果发现是0直接就死了
3吸血系数 单独储存 从而计算每次攻击后的回血量
4眩晕时间 单独储存
5被动技能相关量 包括之前的叠加层数和之前攻击时间

然后说说流程,两个部分,攻击和标记,先说简单的标记,每次遇到要标记的情况,就直接刷新这个人被眩晕的时间段即可,由于冷却时间最少5秒,所以不会再出现被之前的眩晕区间眩晕的情况,这个覆盖是成立的。这样那个人行动时如果发现处于眩晕的时间段就直接把这个行动平移到眩晕结束的时间即可。再说说相对复杂的攻击,因为攻击有可能是同时进行的,所以我的选择是把攻击和结算分开进行,每次如果攻击就在这个时间进行一次结算,不管几个人攻击都只结算一次,这样就不怕各种情况了。

具体实现的时候使用了优先队列,前面代表时间,后面代表行动类型,越大的标号代表相同时间越靠后的行动,另外时间因为最小单位是ms,没有更小的可能,所以直接用整数存储即可。输出的时候因为t到了百万级已经出现误差,我被迫手动四舍五入了一下,然后就没问题了,引以为戒啊。

贴代码

# include <stdio.h>
# include <queue>
# include <algorithm>using namespace std;typedef pair<int , int> P;//时间,行动 int T;double max(double a , double b)
{return (a > b) ? a : b;
}double min(double a , double b)
{return (a < b) ? a : b;
}void solve()
{priority_queue<P , vector<P> , greater<P> > que;//备注0 1 攻击 2 3 标记 4 结算double a[2];//攻击实际伤害int b[2] = {-1 , -1}, e[2] = {-1 , -1}, si[2];//下一次击晕时间 int ce[2] = {0}, ti[2] = {0};//叠加层数,上次攻击时间double hp[2], mhp[2];//生命值,最大生命值 double cov[2] = {0};//回血量int gj[2], xi[2], gc[2], bc[2], wk[2], rx[2], gs[2], lq[2]; int i;for(i = 0 ; i < 2 ; i++) {scanf("%lf %lf", &hp[i], &mhp[i]);scanf("%d %d %d %d %d %d %d %d", &gj[i], &xi[i], &gc[i], &bc[i], &wk[i], &rx[i], &gs[i], &lq[i]);} for(i = 0 ; i < 2 ; i++){a[i] = 100 * gj[i] / (100 + (double)wk[1 - i] * (100.0 - bc[i]) / 100.0 - gc[i]);si[i] = (100 - rx[i]) * 20;}que.push(P(0 , 0));que.push(P(0 , 1));que.push(P(0 , 2));que.push(P(0 , 3));bool f = 0;//是否结算while(!que.empty()){P y = que.top();que.pop();int n = y.second, t = y.first;//要是晕了就平移一下 if(b[n % 2] <= t && t < e[n % 2]){que.push(P(e[n % 2] , n));continue;}if(n < 2)//攻击 {if(ti[n] + 2000 <= t)ce[n] = 0;cov[n] = min((1 + 0.125 * ce[n]) * a[n] , hp[1 - n]) * ((double)xi[n] / 100);hp[1 - n] -= (1 + 0.125 * ce[n]) * a[n];ti[n] = t;if(ce[n] < 4)ce[n]++;que.push(P(t + gs[n] , n));if(!f){f = 1;que.push(P(t , 4));}}else if(n < 4){int num = n % 2;b[1 - num] = t + 1000;e[1 - num] = b[1 - num] + si[1 - num]; que.push(P(t + 1000 * lq[num] , n));}else{f = 0;if(hp[0] > 0)hp[0] = min(cov[0] + hp[0] , mhp[0]);cov[0] = 0;if(hp[1] > 0)hp[1] = min(cov[1] + hp[1] , mhp[1]);cov[1] = 0;//被这步坑惨了 if(t % 10 >= 5)t += 10 - t % 10; if(hp[0] <= 0 || hp[1] <= 0){printf("%.2lf %.2lf %.2lf\n", (double)t / 1000, max(0.00 , hp[0]), max(0.00 , hp[1]));return;}}}
}int main()
{scanf("%d", &T);while(T--){solve();}return 0;
} 

【xdoj难题集】 1059: 英雄联盟相关推荐

  1. html5游戏联盟,腾讯游戏H5合集:英雄联盟宣传篇合集

    原标题:腾讯游戏H5合集:英雄联盟宣传篇合集 作为腾讯游戏业务中重要的一环,英雄联盟已经火到无人不知的地步了,但就算是如此也不能免俗,游戏也需要宣传,今天展示的便是英雄联盟的H5合集. 一.腾讯游戏: ...

  2. 【xdoj难题集】1202 The Offer - Lunatic(附优化版)

    说实话2017年的校赛挺难的,最后三道都不简单,这道题一开始吓了我一大跳,想着如果用最短路算法,魔法阵怎么也要上千万条路径,不过之后看到海拔最高只有100之后总算是安心了. 先说一说大体思路,首先肯定 ...

  3. 【xdoj难题集】1039: 饭桌上的游戏

    题的连接 2014年的压轴题,又是模拟(话说为什么最近做了这么多模拟).总之又是被无数细节给坑了,不过最后结果不错,我这个算法还是挺快的. 还是先说说想法,一看到这题的范围,觉得应该不会超时,比较烦的 ...

  4. 【xdoj难题集】1102 xry111挂灯笼

    题目 这道题虽然做对的不多,但是我倒是做的异常顺利,直接一遍过,感觉在经历了pfunction之后已经领悟了新一层的dp技巧. 说说思路,就是dp递推,关键是掌握如何递推,首先考虑只有一个挂钩的情况, ...

  5. 【xdoj难题集】 1018 Josephus环的复仇的复仇

    题目链接 每天都坚持写写 说实话很早就想写这道题了,但是一直不知道怎么解释那个算法,做完之后也看过聚聚的题解,说有一个什么数学结论,然而我研究了这么久都没有研究出什么数学结论,只能再试着看看了.虽然之 ...

  6. 互联网晚报 | 11月8日 星期一 | 美团外卖公开“订单分配”算法规则;英雄联盟首部动画剧集上线;神舟十三号航天员首次出舱...

    今日看点 ✦ 神舟十三号航天员乘组圆满完成首次出舱活动全部既定任务 ✦ 微信视频号公布MCN招募计划:最高10万元奖励 ✦ 美团外卖公开"订单分配"算法规则,推出"主动改 ...

  7. 【目标检测】英雄联盟能用YOLOv5实时目标检测了 支持onnx推理

    目录 一.项目介绍 二.项目结构 三.准备数据 1.数据标注 2.数据转换格式 四.执行训练 1.anchors文件 2.标签文件 3.预训练模型 4.训练数据 5.修改配置 6.执行训练 五.执行预 ...

  8. 用 Python 详解《英雄联盟》游戏取胜的重要因素!

    作者 | DeepHub IMBA 责编 | 王晓曼 介绍 在过去的几年里,电子竞技社区发展迅速,曾经只是休闲娱乐的电子竞技产业,到2022年有望创造18亿美元的收入. 虽然在这个生态系统中有很多电子 ...

  9. 用Python编写代码分析《英雄联盟》游戏胜利的最重要因素

    来源:DeepHub IMBA 本文约2600字,建议阅读5分钟. 英雄联盟最重要的获胜条件是什么? 介绍 在过去的几年里,电子竞技社区发展迅速,曾经只是休闲娱乐的电子竞技产业,到2022年有望创造1 ...

最新文章

  1. locate,find
  2. python入门-直方图
  3. 关于类的非静态函数指针成员变量
  4. 深度学习中常见的损失函数
  5. 计算机培训开场白,面试开场白及自我介绍范文4篇
  6. 【LOJ】#2184. 「SDOI2015」星际战争
  7. JS模拟的Ping程序 (Web Ping)
  8. 高级语言程序设计II 实验报告三c++使用文本文件和二进制文件的读写比较两者的区别和优劣...
  9. 无法远程xp服务器,五步快速处理在WinXP下IIS无法远程访问的问题
  10. Linux下Nginx安装
  11. 人工智能原理与方法作业1
  12. 计算机刷bios版本,怎么升级Bios?教你快速更新升级Bios
  13. 利用资源文件实现对软件的保护
  14. 大数据时代:架构师该具备什么?
  15. JAVA基础(JAVA移位运算符)
  16. PHP:使用静态变量
  17. ubuntu 下stl obj ply 3dx fbx等各种格式转pcd方法
  18. JNI ---- JNA
  19. 脱壳--02.exe
  20. uni-app封装缓存过期方法

热门文章

  1. Java字符串常量池详解(StringTable)
  2. 单片机常用八位二进制转十六
  3. 在自己的电脑上搭建服务器,发布自己的网站
  4. python subprocess pipe_Python的subprocess模块总结
  5. 一加Nord N300 5G什么时候发布 一加Nord N300 5G配置如何
  6. 用友“老朋友”,开启新合作!
  7. python res函数_python函数
  8. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java毕业生回访系统564c4
  9. Python语言程序设计冲刺试卷卷一综合题
  10. OSC Liblo Window10配置