1118 AlvinZH's Fight with DDLs II

思路

中等题,贪心。

理解题意,每次攻击中,可以使某个敌人生命值-1,自己生命值减去∑存活敌人总攻击力。

贪心思想,血量少攻击高的要先消灭,所以以A/L作为参数排序,即将所有的敌人根据A/L从大到小排序。

遍历一次,对于排序好的敌人,HP减去(总攻击*该敌人血量),总攻击减去该敌人攻击。代码如下:

HP -= (sumA * H[i].L);
sumA -= H[i].A;
if(HP <= 0) break;

分析

贪心证明:对于已经排好序的序列,HP总消耗为 \(\sum_{i = 1}^{n}\sum_{j = i}^{n}\left ( H[i].L*H[j].A \right )\) 。

如果我们交换其中相邻两个的位置,位置设为x,y,HP消耗与原来相比,有影响的也只有i=x和i=y两项,原来是 \(H[x].L*\sum_{j=x}^{n}H[j].A + H[y].L*\sum_{j=y}^{n}H[j].A\) ,而现在变成了\(H[y].L*\sum_{j=x}^{n}H[j].A + H[x].L*\left ( H[x].A+\sum_{j=y+1}^{n}H[j].A \right )\) ,其他未变,后者减去前者,得到\(H[y].L*H[x].A-H[x].L*H[y].A\) ,依照排序来看,有 \(\frac{H[x].A}{H[x].L} \geq \frac{H[y].A}{H[y].L}\) ,所以后者减去前者的值是大于等于0的。

由此可以证明:如果相邻两个交换,会导致HP总消耗增加。任何的一个攻击敌人次序,都可以在已排好序的次序上通过多次上述交换(相邻,且索引值小的后移)得到,由此可以判断所有的攻击次序HP消耗值都大于等于原排序攻击次列。

贪心得证,至于如何多次交换,可参考冒泡排序过程。

时间复杂度:O(nlgn)。

空间复杂度:O(n)。

参考代码

/*
Author: 朱辉(35)
Result: AC Submission_id: 514527
Created at: Mon Dec 25 2017 03:09:00 GMT+0800 (CST)
Problem: 1118 Time: 4 Memory: 2840
*/ #include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std; struct Hero {
int A, L;
bool operator < (const Hero h) const {
return 1.0 * A/L > 1.0 * h.A/h.L;
}
}; int n, HP;
Hero H[1005]; int main()
{
while(~scanf("%d %d", &n, &HP))
{
int sumA = 0;//总攻击力
for (int i = 0; i < n; ++i) {
scanf("%d %d", &H[i].A, &H[i].L);
sumA += H[i].A;
} sort(H, H+n); for (int i = 0; i < n; ++i) {
HP -= (sumA * H[i].L);
sumA -= H[i].A;
if(HP <= 0) break;
} if(HP > 0) printf("YES\n");
else printf("NO\n");
}
}

最新文章

  1. Flume(4)实用环境搭建:source(spooldir)+channel(file)+sink(hdfs)方式
  2. URAL 1077 Travelling Tours(统计无向图中环的数目)
  3. jq 幻灯片插件制作
  4. nginx + tomcat集群和动静资源分离
  5. CSS样式三
  6. 计算N的阶层
  7. RecyclerView实现瀑布流效果(图文详解+源码奉送)
  8. 使用搬瓦工搭建javaweb环境
  9. RDBMS 数据库补丁集补丁号码高速參考-文档 ID 1577380.1
  10. 一个包含所有c++的头文件的头文件
  11. Linux下 目录 压缩 解压缩 打包
  12. 一次young gc耗时过长优化过程
  13. 克隆虚拟机 virtualbox 修改 uuid
  14. LeetCode 404. Sum of Left Leaves (左子叶之和)
  15. Mysql 库表
  16. 博客地址更改为csdn博客:https://blog.csdn.net/zysps1
  17. dao层、service和action的运用和区别
  18. python----数据驱动@ddt.file_data结合yaml文件的使用
  19. 在win10下安装eclipse
  20. 博客(二)注册页面django

热门文章

  1. PLSQL启动很慢的问题
  2. Eclipse 安装PyDev开发Python及初步使用
  3. C语言Web service编程
  4. gatttool的使用
  5. centos环境下创建数据库和表的方法
  6. Gym 100792C Colder-Hotter (三分)
  7. swift - 歌曲列表动画
  8. sockaddr与sockaddr_in
  9. string 转换为枚举对应的值
  10. JSP和servlet之间的传值(总结的很全面)