2016级算法期末上机-F.中等·AlvinZH's Fight with DDLs II
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");
}
}
2016级算法期末上机-F.中等·AlvinZH's Fight with DDLs II的更多相关文章
- 2016级算法期末上机-G.中等·Bamboo's Fight with DDLs II
中等·Bamboo's Fight with DDLs II 分析 一句话:给定字符串,求最长回文子序列长度,动态规划LCS思想的进阶应用 具体思路如下: 对于任意字符串,如果头尾字符相同,那么字符串 ...
- 2016级算法期末上机-E.中等·ModricWang's Fight with DDLs II
1125 ModricWang's Fight with DDLs II 思路 圆内被划分部分数的计算方式如下: 圆内部的每一个交点都使得总份数增加了一:除此之外,每一根直线段最后抵达圆周时,总份数也 ...
- 2016级算法期末上机-H.难题·AlvinZH's Fight with DDLs III
1119 AlvinZH's Fight with DDLs III 思路 难题,最小点覆盖. 分析题意,某一个任务,既可以在笔记本A的 \(a\) 模式下完成,也可以在笔记本B的 \(b\) 模式下 ...
- 2016级算法期末上机-D.简单·AlvinZH's Fight with DDLs I
1117 AlvinZH's Fight with DDLs I 思路 简单题,动态规划. 本题与期末练习赛B题很相似,而且更为简单些.简化问题:在数字序列上取数,不能取相邻的数. DP数组定义,dp ...
- 2016级算法期末上机-B.简单·ModricWang's Fight with DDLs I
1124 ModricWang's Fight with DDLs I 思路 这道题本质上就是一个多项式求值,题目中的n需要手动算一下,单位复根可以根据复数的性质来求,即\(e^{i\pi}+1=0\ ...
- 2016级算法期末上机-I.难题·ModricWang's Fight with DDLs III
1126 ModricWang's Fight with DDLs III 思路 由于题目中已经说明了时间经过了正无穷,因此初始位置是不重要的,并且每条边.每个点的地位是均等的.因此到达每个点的概率就 ...
- 2016级算法期末上机-C.简单·Bamboo's Fight with DDLs III
简单·Bamboo's Fight with DDLs III 分析 一句话:贪心,简单哈夫曼应用,要求的其实是所有结点的值与权值的乘积之和,也就是带权路径长. 可以理解为非叶子节点的权值的和,这里的 ...
- 2016级算法期末上机-A.简单·Bamboo's Fight with DDLs I
简单·Bamboo's Fight with DDLs I 分析 一句话:要装满的完全背包问题. 对比完全背包只有一点要改变:初始化为负无穷 传送门: https://buaacoding.cn/pr ...
- 2016级算法期末模拟练习赛-D.AlvinZH的序列问题
1111 AlvinZH的序列问题 思路 中等题,动态规划. 简化题意,. 坑点一:二维int数组MLE,明显会超过内存限制,由于\(n\)最大为1e4,那么我们的dp数组最大也是1e4,考虑使用sh ...
随机推荐
- 35-Python - 去除list中的空字符
https://www.cnblogs.com/yspass/p/9434366.html list1 = ['122', '2333', '3444', '', '', None] a = list ...
- Golang之函数练习
小例题: package main import "fmt" /* 函数练习, 可变参数使用 写一个函数add 支持1个或多个int相加,并返回相加结果 写一个函数concat,支 ...
- MyBatis 实用篇(二)配置文件
MyBatis 实用篇(二)配置文件 一.全局配置 全局配置:http://www.mybatis.org/mybatis-3/zh/configuration.html <?xml versi ...
- 利用BeanUtils.copyProperties 克隆出新对象,避免对象重复问题
1.经常用jQuery获取标签里面值val(),或者html(),text()等等,有次想把获取标签的全部html元素包括自己也用来操作,查询了半天发现$("#lefttr1"). ...
- SVN下的文件被locked不能update和commit
一次早上开机svn更新代码,提示某一个文件夹被locked,提示clean up,但是clearn up也不行,get lock不行,release lock不行 根据网上搜的,.svn(隐藏文件夹) ...
- java消息中间件的使用与简介
一.为什么要使用消息中间件 消息中间件就是可以省去繁琐的步骤,直达目的,怎么讲呢,就是比如你想很多人,知道你的动态,而知道的人可能手机没电,可能手机信号不好,可能手机不在服务区,或者看的人比较忙,看的 ...
- 安装完 swoole 后出现 PHP Warning: PHP Startup: Unable to load dynamic library 'swoole.so'的解决方法
安装完 swoole 后出现 PHP Warning: PHP Startup: Unable to load dynamic library 'swoole.so' (tried: /home/s ...
- RocketMQ 自定义文件路径
一 .1. 修改store路径2. 修改logs路径3. 修改rmq_bk_gc.log路径4. 修改rmq_srv_gc.log路径二 .1. 获取正确的rocketmq 源码2. 地址:https ...
- nohup、&、setsid、fork和fg、bg究竟有啥区别?
目录 目录 1 1. 名词解释 1 2. 什么是守护进程? 2 2.1. 后台运行 2 2.2. 解释关系 2 3. 以"&"方式运行有何问题? 2 4. fork 2 5 ...
- 23 DesignPatterns学习笔记:C++语言实现 --- 1.5 Prototype
23 DesignPatterns学习笔记:C++语言实现 --- 1.5 Prototype 2016-07-21 (www.cnblogs.com/icmzn) 模式理解