BZOJ4570: [Scoi2016]妖怪
题目传送门
4570: [Scoi2016]妖怪
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 491 Solved: 125
[Submit][Status][Discuss]
Description
邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性。邱老师立志成为妖怪大师,于
是他从真新镇出发,踏上未知的旅途,见识不同的风景。环境对妖怪的战斗力有很大影响,在某种环境中,妖怪可
以降低自己k×a点攻击力,提升k×b点防御力或者,提升自己k×a点攻击力,降低k×b点防御力,a,b属于正实数
,k为任意实数,但是atk和dnf必须始终非负。妖怪在环境(a,b)中的战斗力为妖怪在该种环境中能达到的最大攻击
力和最大防御力之和。strength(a,b)=max(atk(a,b))+max(dnf(a,b))环境由a,b两个参数定义,a,b的含义见前
文描述。比如当前环境a=3,b=2,那么攻击力为6,防御力为2的妖怪,能达到的最大攻击力为9,最大防御力为6。
所以该妖怪在a=3,b=2的环境下战斗力为15。因此,在不同的环境,战斗力最强的妖怪可能发生变化。作为一名优
秀的妖怪训练师,邱老师想发掘每一只妖怪的最大潜力,他想知道在最为不利的情况下,他的n只妖怪能够达到的
最强战斗力值,即存在一组正实数(a,b)使得n只妖怪在该环境下最强战斗力最低。
Input
第一行一个n,表示有n只妖怪。接下来n行,每行两个整数atk和dnf,表示妖怪的攻击力和防御力。
1≤n≤10^6, 0<atk,dnf≤10^8
Output
输出在最不利情况下最强妖怪的战斗力值,保留4位小数。
Sample Input
3
1 1
1 2
2 2
Sample Output
8.0000
题解
首先我们可以得到 $strength= atk + a / b * dnf + dnf + b / a * atk $ ,进而得到 \(strength=(a+b)/a*atk+(a+b)/b * dnf\)
所以我们将atk看为x,dnf看为y,则strength就是一条斜率为$ -b/a $ 的直线,而此时最大战力就是就是最外面的那条直线。所以我们可以将这些直线跑一个半凸包。其实按照我的想法就该三分了,然出题人告诉我这样会挂。。。
正解是这些点些点对应的斜率都有一个范围,然后将 \(strength\) 变为一个双钩函数,之后讨论最值,跟新ans。
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;typedef long long LL;
LL Ina; bool InSign; char Inc;
inline LL geti() {InSign = false; while ((Inc = getchar()) < '0' || Inc > '9') InSign |= Inc == '-'; Ina = Inc - '0';while ((Inc = getchar()) >= '0' && Inc <= '9') Ina = (Ina << 3) + (Ina << 1) + Inc - '0'; return InSign ? -Ina : Ina;
}
const int N = 1e6 + 5;
const double OO = 1e9;
struct P{LL x, y;P(LL a = 0, LL b = 0) : x(a), y(b) {}P operator - (const P &a) const { return P(x - a.x, y - a.y); }LL operator * (const P &a) const { return x * a.y - y * a.x; }bool operator < (const P &a) const { return (x < a.x) || (x == a.x && y < a.y); }void Read() { x = geti(), y = geti(); }
}p[N], Stack[N];
//k = -b/a
inline double get(const P &a) { return -sqrt((double)a.y / a.x); }
inline double getk(const P &a, const P &b) { return (a.x ^ b.x) ? ((double)(a.y - b.y) / (double)(a.x - b.x)) : OO;
}
inline double Cal(const P &a, const double &k) { return k >= 0 ? OO : (double)a.x + a.y + - k * a.x - a.y / k;
}
template <class T>
inline void SelfMin(T &a, const T &b) { if (b < a) a = b; }int main() {int n = geti(), i, j, top = 0;for (i = 1; i <= n; ++i) p[i].Read();sort(p + 1, p + n + 1);Stack[++top] = p[1];for (i = 2; i <= n; ++i) {while (top >= 2 && (Stack[top]-Stack[top-1])*(p[i]-Stack[top-1]) >= 0) --top;Stack[++top] = p[i];}if (top < 2) return printf("%.4lf\n", Cal(Stack[1], get(Stack[1]))), 0;double k, k1, k2, ans = OO;k2 = getk(Stack[1], Stack[2]); k = get(Stack[1]);if (k >= k2) SelfMin(ans, Cal(Stack[1], k));k1 = getk(Stack[top - 1], Stack[top]); k = get(Stack[top]);if (k <= k1) SelfMin(ans, Cal(Stack[top], k));SelfMin(ans, Cal(Stack[top], k1));for (i = 2; i < top; ++i) {k1 = getk(Stack[i - 1], Stack[i]), k2 = getk(Stack[i], Stack[i + 1]);k = get(Stack[i]);SelfMin(ans, Cal(Stack[i], k1));if ((k <= k1) && (k >= k2)) SelfMin(ans, Cal(Stack[i], k));}return printf("%.4lf\n", ans), 0;
}
转载于:https://www.cnblogs.com/cycleke/p/5838884.html
BZOJ4570: [Scoi2016]妖怪相关推荐
- bzoj4570: [Scoi2016]妖怪【凸包+对勾函数最小值】
Description 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性.邱老师立志成为妖怪大师,于 是他从真新镇出发,踏上未知的旅途,见识不同的风景.环境对妖怪的战斗力 ...
- 4570: [Scoi2016]妖怪
4570: [Scoi2016]妖怪 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 591 Solved: 152 [Submit][Status] ...
- 【BZOJ4570】 [Scoi2016]妖怪
Description 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性.邱老师立志成为妖怪大师,于 是他从真新镇出发,踏上未知的旅途,见识不同的风景.环境对妖怪的战斗力 ...
- [SCOI2016]妖怪 牛客网的ACM省选题,个人看法,欢迎交流
链接:https://ac.nowcoder.com/acm/contest/390/1001 来源:牛客网 题目描述 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性. ...
- bzoj 4570: [Scoi2016]妖怪 凸包
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4570 题解 我们知道如果一个怪物要取到攻击力的最大值,那么一定是把防御力都转化了 所以我 ...
- SCOI2016 Day2 简要题解
「SCOI2016」妖怪 题意 有 \(n\) 只妖怪,每只妖怪有攻击力 \(\text{atk}\) 和防御力 \(\text{dnf}\) ,在环境 \((a, b)\) 下,它可以把攻击力和防御 ...
- BZOJ4569: [Scoi2016]萌萌哒
4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 961 Solved: 464 [Submit][Statu ...
- bzoj [Scoi2016]美味
[Scoi2016]美味 Time Limit: 30 Sec Memory Limit: 256 MB Submit: 721 Solved: 391 [Submit][Status][Disc ...
- Bzoj4568: [Scoi2016]幸运数字
Bzoj4568: [Scoi2016]幸运数字 线性基+倍增+LCA 原来线性基还能这么考--一开始看到这个题以为是树上差分线性基,然而线性基不支持删除,所以就挂了. 后来想到倍增线性基,其实到这里 ...
- nyoj999 师傅又被妖怪抓走了 (预处理+bfs+状态压缩)
题目999 题目信息 执行结果 本题排行 讨论区 师傅又被妖怪抓走了 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描写叙述 话说唐僧复得了孙行者,师徒们一心同体,共诣西方.自宝 ...
最新文章
- ajax实现关联词提示
- SNAP实现(转自SuiFei)
- Ubuntu 11.04解决txt文档中文乱码方法
- 【剑指 offer】(十三)—— 在 O(1) 时间删除链表结点
- UML建模工具最近更新汇总(-2022年7月)共16款:Visual State、UML Diagrammer……
- 计算机网络中sep是什么意思,SEP系统介绍及实施方案介绍.ppt
- TeraTerm配置Cygwin连接
- web工程无法访问本地图片解决方案
- 剑指 Offer(C++版本)系列:剑指 Offer 10- II 青蛙跳台阶问题
- 135端口入侵教程(仅学习用)
- Layui Form 如何主动验证表单是否通过
- java基础第十五篇之IO流和递归算法
- 初一计算机课程表,初中课程表空白表格
- 高德地图接口申请 地图接口集成 高德地图API文档
- 2022年全国职业院校技能大赛:网络系统管理项目 A模块-网络构建(10套样题)
- 400错误可能的原因
- WVGA与HVGA、QVGA详细解答
- 【数据库系统】规范化
- LabVIEW编程LabVIEW控制KELLER压力传感器例程与相关资料
- 奋进新时代 和数BaaS开启下一个波澜壮阔科技新世界
热门文章
- redis集群环境搭建入门
- scala method入门到熟悉
- undefined reference to `sqlite3_column_table_name‘
- 云计算-大数据-云安全高等教育改革示范教材
- Cache的疑惑??
- 自动化测试基础篇--Selenium中数据参数化之TXT
- 数据库报错“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”
- POJ 2115C Looooops[一元线性同余方程]
- 自定义弹框,点击提示框外空白区域,让弹框消失
- select、autocomplete标签下拉框