题目大意:

http://www.lydsy.com/JudgeOnline/problem.php?id=4570

题解

我们知道如果一个怪物要取到攻击力的最大值,那么一定是把防御力都转化了
所以我们可以把题目转化成这个式子
求\(min(max(atk + den + \frac{a}{b}dnf + \frac{b}{a}atk))\)
我们设\(k = -\frac{b}{a}\)
那么上式变为了\(min(max(atk + den - (\frac{1}{k}dnf + k*atk)))\)
右侧括号里是对勾函数的形式,我们由数学知识得\(k = -\sqrt{\frac{dnf}{atk}}\)时取得最值
现在我们尝试把所有的点映射到二维平面
设点\((x,y)\),假设通过了一条斜率为\(k(k < 0)\)的直线
我们通过计算发现这个直线的横纵截距之和即为我们上面的计算式
而当\(k = -\sqrt{\frac{dnf}{atk}}\)横纵截距之和最小
所以问题转化成了为二维平面上的一些点确定一些平行线通过这些点使得最大的横纵截距之和最小
我们知道最大的条直线一定是通过上凸壳上的点的
所以我们枚举上凸壳上的点即可

#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(double &x){x=0;char ch;bool flag = false;while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
const int maxn = 1000010;
const double eps = 1e-8;
struct Point{double x,y;Point(double a = 0,double b = 0){x=a;y=b;}
};
typedef Point Vector;
inline Vector operator + (const Vector &a,const Vector &b){return Vector(a.x+b.x,a.y+b.y);}
inline Vector operator - (const Vector &a,const Vector &b){return Vector(a.x-b.x,a.y-b.y);}
inline double operator * (const Vector &a,const Vector &b){return a.x*b.x + a.y*b.y;}
inline double operator / (const Vector &a,const Vector &b){return a.x*b.y - a.y*b.x;}
inline double min_p(const Point &x){return -sqrt(x.y/x.x);}
inline int dcmp(const double x){if(x < eps && x > -eps) return 0;return x > 0 ? 1 : -1;
}
inline double slope(const Point &a,const Point &b){if((dcmp(a.x) == 0) && (dcmp(a.y) == 0)) return 1e10;if((dcmp(b.x) == 0) && (dcmp(b.y) == 0)) return -1e10;if(dcmp(a.x-b.x) == 0 ) return 1e10;return (b.y - a.y)/(b.x - a.x);
}
inline bool cmp(const Point &a,const Point &b){return dcmp(a.x - b.x) == 0 ? a.y < b.y : a.x < b.x;
}
inline double calc(const Point &p,const double k){if(k >= 0 ) return 1e10;return p.x + p.y - k*p.x - p.y/k;
}
Point p[maxn],ch[maxn];
int n,m;
inline void convex(){m = 0;ch[++m] = p[1];for(int i=2;i<=n;++i){while(m > 1 && dcmp((ch[m] - ch[m-1])/(p[i] - ch[m])) >= 0) m -- ;ch[++m] = p[i];}swap(n,m);swap(p,ch);
}
int main(){scanf("%d",&n);for(int i=1;i<=n;++i) read(p[i].x),read(p[i].y);if(n == 1){printf("%.4lf\n",calc(p[1],min_p(p[1])));return 0;}sort(p+1,p+n+1,cmp);convex();double ans = 1e10;double k1,k2,k;k2 = slope(p[1  ],p[2]);k=min_p(p[1]);if(k>=k2) ans=min(ans,calc(p[1],k));  k1 = slope(p[n-1],p[n]);k=min_p(p[n]);if(k<=k1) ans=min(ans,calc(p[n],k));  ans=min(ans,calc(p[n],k1));  for(int i=2;i<n;++i){k = min_p(p[i]),k1 = slope(p[i-1],p[i]),k2 = slope(p[i],p[i+1]);ans = min(ans,calc(p[i],k1));if(dcmp(k-k1) <= 0 && dcmp(k-k2) >= 0 ) ans = min(ans,calc(p[i],k));}printf("%.4lf\n",ans);getchar();getchar();return 0;
}

恕我直言...网上的一些代码和我对拍根本拍不上。。。
而且它们好多互相都拍不上。。。
反正我写过了\\\\\

转载于:https://www.cnblogs.com/Skyminer/p/6431746.html

bzoj 4570: [Scoi2016]妖怪 凸包相关推荐

  1. 4570: [Scoi2016]妖怪

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

  2. bzoj4570: [Scoi2016]妖怪【凸包+对勾函数最小值】

    Description 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性.邱老师立志成为妖怪大师,于 是他从真新镇出发,踏上未知的旅途,见识不同的风景.环境对妖怪的战斗力 ...

  3. [SCOI2016]妖怪 牛客网的ACM省选题,个人看法,欢迎交流

    链接:https://ac.nowcoder.com/acm/contest/390/1001 来源:牛客网 题目描述 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性. ...

  4. 【BZOJ4570】 [Scoi2016]妖怪

    Description 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性.邱老师立志成为妖怪大师,于 是他从真新镇出发,踏上未知的旅途,见识不同的风景.环境对妖怪的战斗力 ...

  5. bzoj 4568: [Scoi2016]幸运数字(树上倍增+线性基)

    4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MB Submit: 1692  Solved: 643 [Submit][Sta ...

  6. BZOJ 4567 [SCOI2016]背单词 (Trie树、贪心)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4567 题解: 显然答案一定小于\(n\times n\), 字符串倒过来变成前缀建Tr ...

  7. [BZOJ 4571][Scoi2016]美味(主席树)

    Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期 望值为 bi,而他的偏好值为 xi .因此,第 ...

  8. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

  9. 一句话题解(20180210~)

    2.9 BZOJ 2006 [NOI2010]超级钢琴.这道题目几天之前就做了.做法是固定右端点,左端点在ST表上走,走法其实就是笛卡尔树的走法.完结撒花! BZOJ 1218 [HNOI2003]激 ...

最新文章

  1. 业界丨涨薪20%!听听这位资深机器学习面试官的内心独白
  2. 干货 | 加速AI发展!一文了解GPU Computing
  3. Mycat原理、应用场景
  4. java生成xsd_java 生成XSD
  5. 微信小程序-页面跳转传值
  6. python爬虫学习(一)
  7. Cpp 对象模型探索 / 不能被继承的类
  8. Java手写Hashmap(HashMap的基本用法)
  9. [蓝桥杯2018决赛]迷宫与陷阱
  10. 重磅!这个生信神器助你文章秒出图——miRNA与基因互作数据库
  11. CentOS配置本地YUM源
  12. java springMVC生成二维码
  13. 经验 | 一目了然,用动图展示 10 大 Git 命令
  14. 【BIRT】02_开发一张简单的报表
  15. 版mysql客户端工具_【小白福利—初级DBA入门必看】MySQL常用工具介绍(三)——客户端工具MySQL...
  16. 二手书交易系统功能结构图
  17. python取出字典重复值_在Python中的字典中查找具有重复值的键
  18. Tyvj4071放射性辐射尘题解
  19. java 构造方法能被继承吗_Java中构造函数可以被继承么
  20. Adobe After Effects CC 2020 中英文语言切换方法

热门文章

  1. 赞!清华大学发布首个自动图机器学习工具包AutoGL
  2. 复练-面试的科技树-企业人才需求和招聘流程
  3. c++ getline 读不到东西_C++,使用getline一直读取不到文件中的内容
  4. 程序员curd编程是什么_为什么许多程序员讨厌结对编程?
  5. linux eclipse stm32,在ubuntu下利用eclipse搭建stm32开发环境和st-link调试
  6. matlab函数包_Matlab论文插图绘制的270种补充颜色
  7. 默认文献工具_如何在浩瀚的Pubmed中快速找到自己需要的文献?分享一个小工具!...
  8. mysql 查询事务信息_查看MySQL最近的事务执行信息
  9. java界面布局都有什么_java入門教程-10.5Java圖形界面之布局設計
  10. cocos2d-android-1 使用方法