【BZOJ4570】 [Scoi2016]妖怪
Description
Input
Output
输出在最不利情况下最强妖怪的战斗力值,保留4位小数。
Sample Input
1 1
1 2
2 2
Sample Output
Solution
这题好像很多种做法。下面介绍一种。
凸包。
对于一个固定的k,那么a,b的取值范围是在一条第一象限的线段上。而最大化的目标其实就是这条线段和x,y轴的截距之和。
那么可以证明,能贡献答案的点一定在上凸壳上。对于凸包上的每一个点,考虑用前后的两条直线去截它然后贡献答案。对于在中间的直线可以通过计算得出最优解。
(计算过程因为这里不是markdown编辑器公式不是那么好打所以就不推了,大概就是把直线方程设出来,根据直接过(a,b)点这个条件然后消掉一个未知量,最后把最大化的东西写出来发现可以用基本不等式啥的搞一搞就好了)
Code
#include <cstdio>
#include <cmath>
#include <algorithm> #define R register
#define maxn 1000010
#define cmin(_a, _b) (_a > (_b) ? _a = (_b) : 0)
typedef double db;
struct Poi {
db x, y;
inline bool operator < (const Poi &that) const {return x < that.x || (x == that.x && y < that.y);}
inline Poi operator - (const Poi &that) const {return (Poi) {x - that.x, y - that.y};}
inline db operator * (const Poi &that) const {return x * that.y - y * that.x;}
} p[maxn], st[maxn];
db slope(R Poi x) {return x.y / x.x;}
int main()
{
// freopen("in.in", "r", stdin);
R int n; scanf("%d", &n);
for (R int i = ; i <= n; ++i) scanf("%lf%lf", &p[i].x, &p[i].y);
std::sort(p + , p + n + );
st[] = p[]; R int top = ;
for (R int i = ; i <= n; ++i)
{
while (top > && (p[i] - st[top - ]) * (st[top] - st[top - ]) <= ) --top;
st[++top] = p[i];
}
R db ans = 1.0 / 0.0;
for (R int i = ; i <= top; ++i)
{
R db lef = i == ? : slope(st[i] - st[i - ]);
R db rig = i == top ? -1.0 / 0.0 : slope(st[i + ] - st[i]);
R db k = -sqrt(slope(st[i]));
if (lef >= k && k >= rig)
cmin(ans, st[i].x + st[i].y - k * st[i].x - st[i].y / k);
if (i > )
{
k = slope(st[i] - st[i - ]);
cmin(ans, st[i].x + st[i].y - k * st[i].x - st[i].y / k);
}
}
printf("%.4lf\n", ans);
return ;
}
【BZOJ4570】 [Scoi2016]妖怪的更多相关文章
- BZOJ4570: [Scoi2016]妖怪
题目传送门 4570: [Scoi2016]妖怪 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 491 Solved: 125 [Submit][Sta ...
- [Bzoj4570][Scoi2016]妖怪(右上凸包)
4570: [Scoi2016]妖怪 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1110 Solved: 336[Submit][Status][ ...
- [BZOJ4570][SCOI2016]妖怪(凸包)
两种做法,前一种会TLE. 第一种是高一数学题做法,设一个妖怪的atk和dnf分别为x和y,则它在(a,b)环境下的战斗力为x+y/a*b+y+x/a*b. 设t为b/a,则战斗力即$f(x,y,t) ...
- BZOJ4570 SCOI2016妖怪(三分)
strength=atk*(1+b/a)+dnf*(1+a/b).设a/b=x,可以发现这是一个关于x的对勾函数.开口向上的一堆凸函数取max还是凸函数,三分即可. 然而无良出题人既卡精度又卡时间.众 ...
- 2018.10.15 bzoj4570: [Scoi2016]妖怪(凸包)
传送门 不得不说这题有点东西啊. 看到题第一眼二分,用二次函数求范围来进行checkcheckcheck,20分滚粗了233. 于是开始思考正解. 发现可以把每只怪物的二元组属性看成二维坐标. 这时对 ...
- BZOJ 4570: [Scoi2016]妖怪
二次联通门 : BZOJ 4570: [Scoi2016]妖怪 二次联通门 : luogu P3291 [SCOI2016]妖怪 LibreOJ : LibreOJ #2015. 「SCOI2016 ...
- 【bzoj4570 scoi2016】妖怪
题目描述 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性.邱老师立志成为妖怪大师,于是他从真新镇出发,踏上未知的旅途,见识不同的风景. 环境对妖怪的战斗力有很大影响,在 ...
- BZOJ4570:[SCOI2016]妖怪——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4570 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性.邱老师立志成 ...
- P3291 [SCOI2016]妖怪
传送门 我数学的确白学了--这种题目竟然一点思路都没有-- 首先可以把每个妖怪看成二维平面上的一个点,那么每一个环境\((a,b)\)就可以看成一条斜率\(k=-\frac{b}{a}\)的过该点的直 ...
随机推荐
- HDU 1159 Common Subsequence (动态规划、最长公共子序列)
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- python pycharm 注册码
D87IQPUU3Q-eyJsaWNlbnNlSWQiOiJEODdJUVBVVTNRIiwibGljZW5zZWVOYW1lIjoiTnNzIEltIiwiYXNzaWduZWVOYW1lIjoiI ...
- AtCoder Beginner Contest 076
A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...
- 手把手教你vue配置请求本地json数据
本篇文章主要介绍了vue配置请求本地json数据的方法,分享给大家,具体如下:在build文件夹下找到webpack.dev.conf.js文件,在const portfinder = require ...
- generator 到 async 的简单理解。
generator 到 async 的简单理解.觉得实现方式很有意思. 1. generator generator 函数返回一个遍历器对象 遍历器对象 每次调用next 方法 返回 有着value ...
- js 元素offset,client , scroll 三大系列总结
1,element.offsetWidth : 包括 padding 和 边框 2,element.clientWidth : 包括 padding ,不包含边框 , 内容超出会溢出盒子的时候,就用s ...
- MHA ssh检查,repl复制检查和在线切换日志分析
一.SSh 检查日志分析 执行过程及对应的日志: 1.读取MHA manger 节点上的配置文件 2.根据配置文件,得到各个主机的信息,逐一进行SSH检查 3.每个主机都通过SSH连接除了自己以外的其 ...
- laraveladmin省市区三级联动
Distpicker是一个中国省市区三级联动选择组件,这个包是基于Distpicker的laravel-admin扩展,用来将Distpicker集成进laravel-admin的表单中 安装 com ...
- 一、core 启动设置文件中的错误(启动文件不存在)
一.启动文件不存在 查看 别人的 原因是
- Qualcomm_Mobile_OpenCL.pdf 翻译-8-kernel性能优化
这章将会说明一些kernel优化的小技巧. 8.1 kernel合并或者拆分 一个复杂的应用程序可能包含很多步骤.对于OpenCL的移植性和优化,可能会问需要开发有多少个kernel.这个问题很难回答 ...