题目传送门

4570: [Scoi2016]妖怪

Time Limit: 10 Sec Memory Limit: 64 MB

Submit: 491 Solved: 125

[Submit][Status][Discuss]

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

题解

首先我们可以得到 $strength= atk + a / b * dnf + dnf + b / a * atk $ ,进而得到 \(strength=(a+b)/a*atk+(a+b)/b * dnf\)

所以我们将atk看为x,dnf看为y,则strength就是一条斜率为$ -b/a $ 的直线,而此时最大战力就是就是最外面的那条直线。所以我们可以将这些直线跑一个半凸包。其实按照我的想法就该三分了,然出题人告诉我这样会挂。。。

正解是这些点些点对应的斜率都有一个范围,然后将 \(strength\) 变为一个双钩函数,之后讨论最值,跟新ans。

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <algorithm>
  4. using namespace std;
  5. typedef long long LL;
  6. LL Ina; bool InSign; char Inc;
  7. inline LL geti() {
  8. InSign = false;
  9. while ((Inc = getchar()) < '0' || Inc > '9') InSign |= Inc == '-';
  10. Ina = Inc - '0';
  11. while ((Inc = getchar()) >= '0' && Inc <= '9') Ina = (Ina << 3) + (Ina << 1) + Inc - '0';
  12. return InSign ? -Ina : Ina;
  13. }
  14. const int N = 1e6 + 5;
  15. const double OO = 1e9;
  16. struct P{
  17. LL x, y;
  18. P(LL a = 0, LL b = 0) : x(a), y(b) {}
  19. P operator - (const P &a) const { return P(x - a.x, y - a.y); }
  20. LL operator * (const P &a) const { return x * a.y - y * a.x; }
  21. bool operator < (const P &a) const { return (x < a.x) || (x == a.x && y < a.y); }
  22. void Read() { x = geti(), y = geti(); }
  23. }p[N], Stack[N];
  24. //k = -b/a
  25. inline double get(const P &a) { return -sqrt((double)a.y / a.x); }
  26. inline double getk(const P &a, const P &b) {
  27. return (a.x ^ b.x) ? ((double)(a.y - b.y) / (double)(a.x - b.x)) : OO;
  28. }
  29. inline double Cal(const P &a, const double &k) {
  30. return k >= 0 ? OO : (double)a.x + a.y + - k * a.x - a.y / k;
  31. }
  32. template <class T>
  33. inline void SelfMin(T &a, const T &b) { if (b < a) a = b; }
  34. int main() {
  35. int n = geti(), i, j, top = 0;
  36. for (i = 1; i <= n; ++i) p[i].Read();
  37. sort(p + 1, p + n + 1);
  38. Stack[++top] = p[1];
  39. for (i = 2; i <= n; ++i) {
  40. while (top >= 2 && (Stack[top]-Stack[top-1])*(p[i]-Stack[top-1]) >= 0)
  41. --top;
  42. Stack[++top] = p[i];
  43. }
  44. if (top < 2) return printf("%.4lf\n", Cal(Stack[1], get(Stack[1]))), 0;
  45. double k, k1, k2, ans = OO;
  46. k2 = getk(Stack[1], Stack[2]); k = get(Stack[1]);
  47. if (k >= k2) SelfMin(ans, Cal(Stack[1], k));
  48. k1 = getk(Stack[top - 1], Stack[top]); k = get(Stack[top]);
  49. if (k <= k1) SelfMin(ans, Cal(Stack[top], k));
  50. SelfMin(ans, Cal(Stack[top], k1));
  51. for (i = 2; i < top; ++i) {
  52. k1 = getk(Stack[i - 1], Stack[i]), k2 = getk(Stack[i], Stack[i + 1]);
  53. k = get(Stack[i]);
  54. SelfMin(ans, Cal(Stack[i], k1));
  55. if ((k <= k1) && (k >= k2)) SelfMin(ans, Cal(Stack[i], k));
  56. }
  57. return printf("%.4lf\n", ans), 0;
  58. }

BZOJ4570: [Scoi2016]妖怪的更多相关文章

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

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

  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妖怪(三分)

    strength=atk*(1+b/a)+dnf*(1+a/b).设a/b=x,可以发现这是一个关于x的对勾函数.开口向上的一堆凸函数取max还是凸函数,三分即可. 然而无良出题人既卡精度又卡时间.众 ...

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

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

  5. BZOJ 4570: [Scoi2016]妖怪

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

  6. 【bzoj4570 scoi2016】妖怪

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

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

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

  8. 【BZOJ4570】 [Scoi2016]妖怪

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

  9. P3291 [SCOI2016]妖怪

    传送门 我数学的确白学了--这种题目竟然一点思路都没有-- 首先可以把每个妖怪看成二维平面上的一个点,那么每一个环境\((a,b)\)就可以看成一条斜率\(k=-\frac{b}{a}\)的过该点的直 ...

随机推荐

  1. Orchard中如何配置远端发布

    Orchard中默认安装是有Blog功能的.下面介绍如何配置Remote Blog Publishing功能,使用Windows Live Writer客户端发布博客. 一,开启Remote Blog ...

  2. 【Windows编程】系列第九篇:剪贴板使用

    上一篇我们学习了常见的通用对话框,本篇来了解剪贴板的使用,它常用于复制粘贴功能. 剪贴板是Windows最早就加入的功能,由于该功能非常实用,我们几乎每天都会使用到.通过剪贴板,我们就可以将数据从一个 ...

  3. EF With SQLite

    EF 虽说官方声称支持SQLite,但实际用起来还真没有SQLSever好使. 不支持真正的CodeFirst,需要先建表结构. 不支支持Migration 需要修改App.config 文件 安装 ...

  4. [转]ArcIMS 中地图坐标参考设置(ArcGIS Unknown Spatial Reference)

    "ArcGIS Unknown Spatial Reference"问题: shp文件在Arcgis打开后经常因为原有坐标系无法识别而丢失信息,出现以下提示信息: "Un ...

  5. 【原】CSS实现背景透明,文字不透明,兼容所有浏览器

    11.11是公司成立的日子,16岁啦,我呢3岁半,感谢公司给了这样一个平台,让我得以学习和成长,这里祝愿公司发展越来越好~ 进入主题,每年11月11号是光棍节,产生于校园,本来只是一流传于年轻人的娱乐 ...

  6. Fast RCNN 训练自己数据集 (2修改数据读取接口)

    Fast RCNN训练自己的数据集 (2修改读写接口) 转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ http ...

  7. COGS743. [网络流24题] 最长k可重区间集

    743. [网络流24题] 最长k可重区间集 ★★★   输入文件:interv.in   输出文件:interv.out   简单对比时间限制:1 s   内存限制:128 MB «问题描述: «编 ...

  8. C/C++编程语言学习资料尽收眼底 电子书+视频教程

    Visual C++(VC/MFC)学习电子书及开发工具下载请看这里 史无前例的网络最全最强C/C++资料索引: C/C++编程语言学习资料尽收眼底 电子书+视频教程 VC++/MFC(VC6)开发技 ...

  9. 关于NODE NPM 输入命令后没反应的问题

    输入NPM 命令 如 install  config help都没有反应,光标在下面一直闪,只有 -v 有反应,查了下,是npm config set prefix 改包的路径出问题了 解决办法就是删 ...

  10. Android5.0资源 colorAccent,colorPrimary,colorPrimaryDark