题目大意:

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;
}

恕我直言...网上的一些代码和我对拍根本拍不上。。。

而且它们好多互相都拍不上。。。

反正我写过了\\\\\

bzoj 4570: [Scoi2016]妖怪 凸包的更多相关文章

  1. BZOJ 4570: [Scoi2016]妖怪

    二次联通门 : BZOJ 4570: [Scoi2016]妖怪 二次联通门 : luogu P3291 [SCOI2016]妖怪 LibreOJ : LibreOJ  #2015. 「SCOI2016 ...

  2. [BZOJ4570][SCOI2016]妖怪(凸包)

    两种做法,前一种会TLE. 第一种是高一数学题做法,设一个妖怪的atk和dnf分别为x和y,则它在(a,b)环境下的战斗力为x+y/a*b+y+x/a*b. 设t为b/a,则战斗力即$f(x,y,t) ...

  3. [Bzoj4570][Scoi2016]妖怪(右上凸包)

    4570: [Scoi2016]妖怪 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1110  Solved: 336[Submit][Status][ ...

  4. BZOJ4570: [Scoi2016]妖怪

    题目传送门 4570: [Scoi2016]妖怪 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 491 Solved: 125 [Submit][Sta ...

  5. bzoj 4570 妖怪

    bzoj 4570 妖怪 正解应该是 \(O(nlogn)\) 的凸包,但被我的 \(O(100n)\) 的三分水过去了. 记 $x=\frac b a $ ,显然有 \(strength_i=ATK ...

  6. BZOJ 4571: [Scoi2016]美味

    二次联通门 : BZOJ 4571: [Scoi2016]美味 /* BZOJ 4571: [Scoi2016]美味 dalao们都在说这题如果没有加法balabala就可以用可持久化trie解决了 ...

  7. 【BZOJ 4570】【SCOI 2016】妖怪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4570 对于每个妖怪的两个值,看成二位平面上的一个点的横纵坐标(x,y). 因为只关心a/b,所以设经 ...

  8. 2018.10.15 bzoj4570: [Scoi2016]妖怪(凸包)

    传送门 不得不说这题有点东西啊. 看到题第一眼二分,用二次函数求范围来进行checkcheckcheck,20分滚粗了233. 于是开始思考正解. 发现可以把每只怪物的二元组属性看成二维坐标. 这时对 ...

  9. BZOJ4570:[SCOI2016]妖怪——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4570 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性.邱老师立志成 ...

随机推荐

  1. 裸眼3D全攻略3:拍摄3D—瞳距、镜距、视角偏转与空间感

    http://sd89.blog.163.com/blog/static/356041322014112532958728/ 3D图片的拍摄,与平面有着全新的不同要求,那就是空间感的表现. 简单来说, ...

  2. Java学习笔记之MyEclipse 2017 CI 7、CI 8、CI 9和CI 10的安装与激活

    0x00 前言 本文介绍MyEclipse 2017 CI 7.CI 8.CI 9和CI 10的安装与激活. 重要提示:此方法理论上应该能激活MyEclipse 2017 CI所有系列,即激活方法是通 ...

  3. Vue学习笔记之Vue学习前的准备工作

    0x00 起步 1.扎实的HTML/CSS/Javascript基本功,这是前置条件. 2.不要用任何的构建项目工具,只用最简单的<script>,把教程里的例子模仿一遍,理解用法.不推荐 ...

  4. 20145106 《Java程序设计》第1周学习总结

    20145106 <Java程序设计>第1周学习总结 教材学习内容总结 因为我用的是Mac,所以教材内容暂时对我的编译java没有帮助.不过还好我也在同学和自己的帮助学习下初步学会了在Ma ...

  5. ENC28J60

    8 KB发送接收数据包双端口 SRAM

  6. arm-linux-ld命令

    我们对每个c或者汇编文件进行单独编译,但是不去连接,生成很多.o 的文件,这些.o文件首先是分散的,我们首先要考虑的如何组合起来:其次,这些.o文件存在相互调用的关系:再者,我们最后生成的bin文件是 ...

  7. linux下强制退出指定用户开启的伪终端

    一.环境 发行版:Ubuntu 18.04.1 LTS 代号:bionic 内核版本:4.15.0-30-generic 二.背景 每次通过ssh登陆服务器,但是超时后自动断开了与服务器的连接,因此在 ...

  8. Android 引用资源

    比如在 strings.xml 中找到的 Hello world!字符串,我们有两种方式可以引用它: 1. 在代码中通过 R.string.hello_world 可以获得该字符串的引用: 2. 在 ...

  9. json文件为空时读取会报错

    simplejson.errors.JSONDecodeError: Expecting value: line column () 提示说是解码错误 可以用下面的方法判断json文件是否为空 imp ...

  10. python 行列式计算

    N= #声明2x2的数组arr并将所有元素赋值为 None arr=[[None] * N for row in range(N)] print('|a1 b1|') print('|a2 b2|') ...