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

邱老师是妖怪爱好者,他有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只妖怪在该环境下最强战斗力最低。

对于每个妖怪当点,那么就相当于是找一个斜率,使得过点之后其中最外面的线的截距之和。

那么维护一个右上凸壳,我们不难发现当y=kx+b这条直线过(x0,y0)点的时候,我们所要求的答案即为y0+x0-(kx0+y0/k),是一个对勾函数,求出k的取值后分类讨论即可。

要注意特判一个点和两个点的情况。

  1. #include<map>
  2. #include<cmath>
  3. #include<stack>
  4. #include<queue>
  5. #include<cstdio>
  6. #include<cctype>
  7. #include<vector>
  8. #include<cstdlib>
  9. #include<cstring>
  10. #include<iostream>
  11. #include<algorithm>
  12. using namespace std;
  13. typedef long long ll;
  14. typedef double dl;
  15. const int N=1e6+;
  16. const int INF=1e9;
  17. const dl eps=1e-;
  18. inline int read(){
  19. int X=,w=;char ch=;
  20. while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
  21. while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
  22. return w?-X:X;
  23. }
  24. struct point{
  25. dl x,y;
  26. point(dl xx=,dl yy=){x=xx;y=yy;}
  27. point operator -(const point &b)const{
  28. return point(x-b.x,y-b.y);
  29. }
  30. dl operator *(const point &b)const{
  31. return x*b.y-y*b.x;
  32. }
  33. bool operator <(const point &b)const{
  34. return x==b.x?y<b.y:x<b.x;
  35. }
  36. }p[N],q[N];
  37. int n,l,per[N];
  38. void graham(){
  39. sort(p+,p+n+);
  40. for(int i=;i<=n;i++){
  41. while(l>=&&(q[l]-q[l-])*(p[i]-q[l])>=)l--;
  42. q[++l]=p[i];
  43. }
  44. }
  45. inline dl slope(point u,point v){
  46. if(u.x==v.x)return INF;
  47. return (u.y-v.y)/(u.x-v.x);
  48. }
  49. inline dl suan(dl k1,dl k2,dl x0,dl y0){
  50. dl maxn=-sqrt(y0/x0),tmp;
  51. if(maxn<k1)tmp=k1*x0+y0/k1;
  52. else if(maxn<=k2)tmp=maxn*x0+y0/maxn;
  53. else tmp=k2*x0+y0/k2;
  54. return y0+x0-tmp;
  55. }
  56. int main(){
  57. n=read();
  58. for(int i=;i<=n;i++)p[i].x=read(),p[i].y=read();
  59. graham();
  60. dl ans=INF;
  61. if(l==){
  62. printf("%.4lf\n",suan(-INF,INF,q[].x,q[].y));
  63. return ;
  64. }
  65. if(l==){
  66. dl k=slope(q[],q[]);
  67. if(k>){
  68. printf("%.4lf\n",suan(-INF,INF,q[].x,q[].y));
  69. return ;
  70. }
  71. }
  72. int L,R;
  73. for(int i=;i<=l;i++){
  74. int j=i+;
  75. dl k1=slope(q[i],q[j]);
  76. if(k1>)continue;
  77. L=i;break;
  78. }
  79. for(int i=L;i<=l;i++){
  80. int j=i+;
  81. dl k1=slope(q[i],q[j]);
  82. if(k1>){R=i;break;}
  83. }
  84. for(int i=L;i<=R;i++){
  85. dl l1=slope(q[i],q[i+]);
  86. dl l2=slope(q[i],q[i-]);
  87. if(l1>)l1=-INF;
  88. if(l2>)l2=;
  89. ans=min(ans,suan(l1,l2,q[i].x,q[i].y));
  90. }
  91. printf("%.4lf\n",ans);
  92. return ;
  93. }

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

BZOJ4570:[SCOI2016]妖怪——题解的更多相关文章

  1. BZOJ4570: [Scoi2016]妖怪

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

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

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

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

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

  4. BZOJ4570 SCOI2016妖怪(三分)

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

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

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

  6. BZOJ 4570: [Scoi2016]妖怪

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

  7. 【bzoj4570 scoi2016】妖怪

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

  8. 【BZOJ4570】 [Scoi2016]妖怪

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

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

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

随机推荐

  1. 初试Docker on Debian on VirtualBox

    一直以来都对Docker如雷贯耳,很想尝试一下但都被各种忙给耽误了,最近由于项目调试,需要安装 Oracle 和 SQL Server 数据库,但又不想安装到本机系统里,于是下决心啃一下docker这 ...

  2. git 操作几个命令

     git clone ssh://lijianfeng@192.168.1.246:29418/GMGameSDK压栈:git stash查状态:git status切换到要修改的提交:git reb ...

  3. Java JDK5.0新特性

    JDK5.0新特性 虽然JDK已经到了1.8 但是1.5(5.0)的变化是最大的 1. 增强for循环 foreach语句 foreach简化了迭代器 作用: 对存储对象的容器进行迭代 (数组, co ...

  4. Python 的非正式介绍

    在下面的例子中,通过提示符 (>>> 与 ...) 的出现与否来区分输入和输出:如果你想复现这些例子,当提示符出现后,你必须在提示符后键入例子中的每一个词:不以提示符开头的那些行是解 ...

  5. 四分树 (Quadtrees UVA - 297)

    题目描述: 原题:https://vjudge.net/problem/UVA-297 题目思路: 1.依旧是一波DFS建树 //矩阵实现 2.建树过程用1.0来填充表示像素 #include < ...

  6. poj 2155 (二维树状数组 区间修改 求某点值)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 33682   Accepted: 12194 Descript ...

  7. CTC (Connectionist Temporal Classification) 算法原理

    (原创文章,转载请注明出处哦~) 简单介绍CTC算法 CTC是序列标注问题中的一种损失函数. 传统序列标注算法需要每一时刻输入与输出符号完全对齐.而CTC扩展了标签集合,添加空元素. 在使用扩展标签集 ...

  8. javaScript中两个等于号和三个等于号之间的区别

    一言以蔽之:==先转换类型再比较,===先判断类型,如果不是同一类型直接为false. ===表示恒等于,比较的两边要绝对的相同 alert(0 == ""); // trueal ...

  9. POJ 3714 Raid(计算几何の最近点对)

    Description After successive failures in the battles against the Union, the Empire retreated to its ...

  10. es6从零学习(三):Class的基本用法

    es6从零学习(三):Class的基本用法 一:定义一个类 //定义类 class Point { constructor(x, y) { this.x = x; this.y = y; } toSt ...