[Bzoj4570][Scoi2016]妖怪(右上凸包)
4570: [Scoi2016]妖怪
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 1110 Solved: 336
[Submit][Status][Discuss]
Description
Input
Output
输出在最不利情况下最强妖怪的战斗力值,保留4位小数。
Sample Input
Sample Output
8.0000
分析
虽然是看了别人的博客才写起的,但也要写博客加深印象。

发现是L是一条斜率-b/a的直线。
如果已知直线L,在它下最强的妖怪是谁呢?
那么画图来试试,一大堆小点点是一个妖怪,然后右上角是维护的右上凸包

发现粉色直线与右上凸包的切点是在它下的最强妖怪
为什么是右上凸包与它切点最优,因为我们答案是横纵截距之和,我们把直线往下平移发现横纵截距都在减小,肯定不会比切点的战斗力小
已知右上凸包怎么对右上凸包每个点求出一个最优的斜率k使它为切点?
可以得出结论:斜率一定是大于它与上一个点连线的斜率,小于它与下一个点连线的斜率
设右上凸包每一个点与下一个点连线斜率为ki
那么斜率k就在这个范围内
,我们要在这个范围内求一个点使答案最小。
当我们已知点(x,y)求L时,x,y变成了常数,又斜率k为-b/a
那么答案可以表示为
发现是个双钩函数,在k = -(x/y)^½时取最小。
因为是双钩函数不满足单调,我就去三分了,然后华丽丽T了。
其实我们可以判断一下双钩函数顶点是否在合法范围内,是的话取最小值
不是的话肯定是关于双钩函数的一边,则具有单调性。
那么此时我就想到二分了。。。然后完美地t了
正解:
合法范围ki-1和ki一定是双钩函数定义域的端点。每个点可以用ki算一次答案,如果顶点在定义域内还可以算一次答案
AC代码:
# include <iostream>
# include <cstdio>
# include <cstring>
# include <cmath>
# include <algorithm>
using namespace std;
const int N = 1e6 + ;
const double eps = 1e-;
const double inf = 0x3f3f3f3f;
struct Point{
double x,y;
Point(){}
Point(double a,double b) : x(a),y(b){}
void read(){scanf("%lf %lf",&x,&y);}
double com(){return x + y + * sqrt(x * y);}
bool operator <(const Point & other)const{return x == other.x ? y > other.y : x > other.x;}
}a[N];
int n,ed;double k[N],ans = inf;
Point operator -(Point a,Point b){return Point(a.x - b.x,a.y - b.y);}
double Get(Point a){return a.y / a.x;}
double Cross(Point a,Point b){return a.x * b.y - a.y * b.x;}
int main()
{
scanf("%d",&n);
for(int i = ;i <= n;i++)a[i].read();
sort(a + ,a + n + );int top = ;
for(int i = ;i <= n;i++)
{
while(top > && Cross(a[i] - a[top],a[top] - a[top - ]) >= )top--;
a[++top] = a[i];
}
a[top + ] = Point(,);
for(int i = ;i <= top;i++)
{
k[i] = Get(a[i + ] - a[i]);
ed = i;if(k[i] >= )break;
}
k[ed] = -eps;k[] = -inf;
for(int i = ;i <= ed;i++)
{
double mk = -sqrt(a[i].y / a[i].x),cg = inf,he;
if(mk > k[i - ] && mk < k[i])cg = a[i].com();
he = a[i].x + a[i].y - a[i].x * k[i] - a[i].y / k[i];
cg = cg > he ?
he : cg;ans = ans > cg ? cg : ans;
}
printf("%.4lf\n",ans);
}
[Bzoj4570][Scoi2016]妖怪(右上凸包)的更多相关文章
- 2018.10.15 bzoj4570: [Scoi2016]妖怪(凸包)
传送门 不得不说这题有点东西啊. 看到题第一眼二分,用二次函数求范围来进行checkcheckcheck,20分滚粗了233. 于是开始思考正解. 发现可以把每只怪物的二元组属性看成二维坐标. 这时对 ...
- BZOJ4570: [Scoi2016]妖怪
题目传送门 4570: [Scoi2016]妖怪 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 491 Solved: 125 [Submit][Sta ...
- [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还是凸函数,三分即可. 然而无良出题人既卡精度又卡时间.众 ...
- BZOJ 4570: [Scoi2016]妖怪
二次联通门 : BZOJ 4570: [Scoi2016]妖怪 二次联通门 : luogu P3291 [SCOI2016]妖怪 LibreOJ : LibreOJ #2015. 「SCOI2016 ...
- 【bzoj4570 scoi2016】妖怪
题目描述 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性.邱老师立志成为妖怪大师,于是他从真新镇出发,踏上未知的旅途,见识不同的风景. 环境对妖怪的战斗力有很大影响,在 ...
- LOJ#2015. 「SCOI2016」妖怪(凸包)
传送门 首先可以把每个妖怪看成二维平面上的一个点,那么每一个环境\((a,b)\)就可以看成一条斜率\(k=-\frac{b}{a}\)的过该点的直线,战斗力就是这条直线在两坐标轴上的截距之和 对于每 ...
- BZOJ4570:[SCOI2016]妖怪——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4570 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性.邱老师立志成 ...
- 【BZOJ4570】 [Scoi2016]妖怪
Description 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性.邱老师立志成为妖怪大师,于 是他从真新镇出发,踏上未知的旅途,见识不同的风景.环境对妖怪的战斗力 ...
随机推荐
- PMP项目管理学习笔记(5)——整合管理之制定项目章程
关于两个输入 在很多过程中,会用到这两个输入: 企业环境要素 是关于你的公司如何开展业务所需要知道的所有信息. 在你计划项目时,有很多关于公司的信息会非常有用,你需要知道各个不同部门是如何运作的,你所 ...
- 什么是cookie(前段时间看到别人简历上把cookie和localStorage混淆了所以专门又去了解了下)
在前端面试中,有一个必问的问题:请你谈谈cookie和localStorage有什么区别啊? localStorage是H5中的一种浏览器本地存储方式,而实际上,cookie本身并不是用来做服务器存储 ...
- CWnd::Updata的作用
CWnd::Updata的作用 CWnd::UpdateData 调用此成员函数以在对话框中初始化数据,或者取回和验证对话框数据. BOOL UpdateData(BOOL bSaveAndValid ...
- python之bool (布尔值)
用途: 判断真假 识记: 空的字符串是False,非空的就是True 0 是False,非0的都是True 格式: True False 布尔值转换成字符串: print(type(str(Tru ...
- docker部署xxl-job
资源 xxl-job:1.9.1 docker:17.05.0-ce maven:3.5.0-jdk-8 tomcat:8.5.23.0 mysql:5.6.40 一.创建数据库 克隆项目到服务器下 ...
- 二叉树的创建一数据结构一C++
#include <iostream> using namespace std; //二叉树结点typedef struct BitNode { cha ...
- 【转载】form表单的两种提交方式,submit和button的用法
1.当输入用户名和密码为空的时候,需要判断.这时候就用到了校验用户名和密码,这个需要在jsp的前端页面写:有两种方法,一种是用submit提交.一种是用button提交.方法一: 在jsp的前端页面的 ...
- linux 服务器 php vue项目部署流程总结
服务器配置 购买阿里云服务器 (选择ubuntu 16系统 / 内存2G以上) 安全策略, 入规则: 添加端口 20,21,22, 80, 443, 3306, 8080, 安装宝塔 wget -O ...
- Vijos1144 皇宫看守 (0/1/2三种状态的普通树形Dp)
题意: 给出一个树以及一些覆盖每个点的花费,求每个点都能被自己被覆盖,或者相邻的点被覆盖的最小价值. 细节: 其实我乍一眼看过去还以为是 战略游戏 的复制版 可爱的战略游戏在这里QAQ(请原谅这波广告 ...
- python常用函数 A
1.any() iterable元素是不是全为0 2.all() iterable元素是不是有0 a = [1, 2, 3] b = [1, 0, 3] c = [0, 0, 0] # an ...