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

解题思路:

不难推出一个妖怪在环境 (a,b) ( a , b ) (a,b)下的最强战力为 atk+dnf+dnf∗k+atk/k,k=a/b a t k + d n f + d n f ∗ k + a t k / k , k = a / b atk+dnf+dnf*k+atk/k,k=a/b。
比较容易想到二分答案加上解一元二次方程判是否有解的方法,但是会TLE。
不妨把一个妖怪看作平面上的点 (x,y) ( x , y ) (x,y),那么在点 (x,y) ( x , y ) (x,y)处的斜率为 k(k<0) k ( k < 0 ) k(k的直线得到的答案为横纵截距之和,即 x+y−x∗k−y/k x + y − x ∗ k − y / k x+y-x*k-y/k
这样可以很好的契合原式,再根据对勾函数性质,如果单独使点 (x,y) ( x , y ) (x,y)最小,得到的答案为 x+y+2∗sqrt(xy) x + y + 2 ∗ s q r t ( x y ) x+y+2*sqrt(xy)
考虑求出这n个点的凸包,那么最大的答案永远在凸包上,而且每个点作为最大值都有一个斜率k的取值范围,所以我们只需求出每个点在这个区间内的最小值即可。
如果单独使点i最小的同时,也使得点i是所有点的最大值,即斜率 −sqrt(y/x) − s q r t ( y / x ) -sqrt(y/x)的直线可以与点i相切时,则用 −sqrt(y/x) − s q r t ( y / x ) -sqrt(y/x)更新答案,否则,用这个点所连的两边的斜率计算的较小值更新答案。
所以这道题还是比较有思维难度的。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int getint()
{int i=0,f=1;char c;for(c=getchar();(c!='-')&&(c<'0'||c>'9');c=getchar());if(c=='-')f=-1,c=getchar();for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0';return i*f;
}const int N=1000005;
const double INF=1e20;
struct point
{double x,y;point(){}point(double _x,double _y):x(_x),y(_y){};inline friend point operator - (const point &a,const point &b){return point(a.x-b.x,a.y-b.y);}inline friend double operator * (const point &a,const point &b){return a.x*b.y-a.y*b.x;}inline friend bool operator < (const point &a,const point &b){return a.x==b.x?a.y>b.y:a.x<b.x;}inline friend double slope(const point &a,const point &b){return a.x==b.x?-INF:(b.y-a.y)/(b.x-a.x);}
}p[N];
int n;double calc(double x,double y,double k)
{if(!k||k==INF||k==-INF)return INF;return x+y-x*k-y/k;
}void solve()
{sort(p+1,p+n+1);int id=1;for(int i=2;i<=n;i++)if(p[i].y>p[id].y)id=i;for(int i=id;i<=n;i++)p[i-id+1]=p[i];n=n-id+1;int top=1;for(int i=2;i<=n;i++){while(top>1&&(p[i]-p[top-1])*(p[top]-p[top-1])<=0)top--;p[++top]=p[i];}n=top;double ans=INF;for(int i=1;i<=n;i++){double k=-sqrt(p[i].y/p[i].x);double kl=i==1?INF:slope(p[i-1],p[i]);double kr=i==n?-INF:slope(p[i],p[i+1]);if(kl>=k&&k>=kr)ans=min(ans,calc(p[i].x,p[i].y,k));else ans=min(ans,min(calc(p[i].x,p[i].y,kl),calc(p[i].x,p[i].y,kr)));}printf("%0.4lf\n",ans);
}int main()
{//freopen("lx.in","r",stdin);n=getint();for(int i=1;i<=n;i++)p[i].x=getint(),p[i].y=getint();solve();}

bzoj4570: [Scoi2016]妖怪【凸包+对勾函数最小值】相关推荐

  1. bzoj 4570: [Scoi2016]妖怪 凸包

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4570 题解 我们知道如果一个怪物要取到攻击力的最大值,那么一定是把防御力都转化了 所以我 ...

  2. 4570: [Scoi2016]妖怪

    4570: [Scoi2016]妖怪 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 591  Solved: 152 [Submit][Status] ...

  3. 对勾函数_对勾函数?2020福建省中考压轴题分析

    训练营机密视频大公开 欢迎转发.分享 传播知识,传播力量! 福建也是全省统一考 选择题: 这题考的是二次函数的性质,先求出对称轴就好了 填空题: 这题看似有反比例,确实会用到反比例函数的对称性.但其实 ...

  4. lisp语言100以内勾股数_三个视频搞定:函数的最值、对勾函数、分式函数性质与图像、分段函数最值...

    ● 本文适合高一上学期.高三一轮复习的同学阅读.先看视频再看文字,看视频时注意利用暂停,想清楚每一步变形的依据. 01 函数的最值.对勾函数的性质 视频讲解 1.函数的最大(小)值 说明: (1)最大 ...

  5. 对勾函数_对勾函数的图像及其性质1.pptx

    对勾函数的图像及其性质1.pptx 热烈欢迎各位老师前来听课! 况秀玉春 1.给出一个确定的函数常从几个方面研究它: 定义域.值域.奇偶性. 单调性.函数图象 ⑴.函数的定义域 函数 y=f(x) 中 ...

  6. 对勾函数的性质及其应用

    对勾函数的性质及其应用 对勾函数虽然简单,但是由于其和二次函数,基本不等式之间的天然联系,使得其成为高中阶段一个经常考察,也经常使用的函数. 1 定义 对勾函数:对勾函数是形如f(x)=ax+bxf( ...

  7. 计算机图形学对勾函数,对勾函数和双刀函数

    已知函数f(x)=x+(m/x)-2,(x>0)的最小值为0,求实数m的值.他(她)也坦言此题不难,想听听我的思路.1对勾函数对勾函数.或者叫耐克函数,是同学们比较熟悉的. 最典型的就是f(x) ...

  8. boost::math模块使用 Brent 方法求函数最小值的示例

    boost::math模块使用 Brent 方法求函数最小值的示例 实现功能 C++实现代码 实现功能 boost::math模块使用 Brent 方法求函数最小值的示例 C++实现代码 #inclu ...

  9. python牛顿法寻找极值_python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例...

    Rosenbrock函数的定义如下: 其函数图像如下: 我分别使用梯度下降法和牛顿法做了寻找Rosenbrock函数的实验. 梯度下降 梯度下降的更新公式: 图中蓝色的点为起点,橙色的曲线(实际上是折 ...

最新文章

  1. 使用DeflateStream压缩与解压
  2. Redis宕机了怎么办?
  3. iis6扩展php_Web服务器IIS6的PHP5.2.5最佳配置方法
  4. django用户认证系统——登录4
  5. smart700iev3 程序下载设置_分享一款Aira2下载工具
  6. Qt文档阅读笔记-QIODevice解析及Audio Example实例解析
  7. 修改一个CGRect的值
  8. M1 MacBook Air值不值得买?使用体验分享
  9. paip.SQL特殊字符转义字符处理
  10. 只需10行代码就让你的U盘变成纯净版winPE系统安装启动盘
  11. echarts折线图鼠标悬浮竖线_设置Echarts鼠标悬浮样式
  12. 【转载】UWP应用设置和文件设置:科普
  13. Iphone 和 Ipad 开发 区别
  14. 01-快速入门webpack模块化打包工具
  15. Java 阿里命名以及注释规范
  16. 几道和「黑洞照片」那种海量数据有关的算法问题
  17. 阿里云物联网平台搭建
  18. MacOS Big Sur Beta 测评|使用体验|有哪些BUG?|如何安装?|实际体验如何?|WWDC2020
  19. 设备健康管理软件如何帮助企业优化设备维保计划?
  20. SSM学习笔记4(Spring整合Mybatis,P26-P28,真吉尔难)

热门文章

  1. python数字识别kaggle论文_基于Python语言Kaggle的数据集分析
  2. Java Lambda reduce 例子 全网reduce最清晰易懂的例子,不服来辩 xxx XXX
  3. 笔记本UIOP几个键总是输入数字的问题
  4. cocos2dx 特效 3D特效
  5. android studio官方教程 pdf,android studio教程pdf
  6. 浅谈数据库,数据仓库,数据中台
  7. 找到组织了---perftest工作室 TIB工作室
  8. php 预编译,预编译的prepare statements 管理, 实现和思路
  9. 裸金属服务器启动之PXE与IPXE实践
  10. pycharm如何设置官方中文?pycharm如何汉化?pycharm终于支持官中了!!!