唉 被秀了。。。 还是太弱,说好的数形结合呢,列个式子出来后就被吓到了,然后就懵逼了。

题意:

有一条狗,从原点出发,沿n个向量走,每个向量只走一次,沿着一个向量(x,y)走时,既可以往(x,y)方向走,也可以往(-x,-y)方向走。 然后问这条狗离原点最远的距离。

如果写成方程:

n个向量分别表示为: (x1,y1) (x2,y2) (x3,y3) ... (xn,yn)

第i个向量往(xi,yi)方向则ai=1,否则ai=-1

则ans = (a1*x1+a2*x2+...+an*xn)^2 + (a1*y1+a2*y2+...+an*yn)^2

要你给出一个(a1,a2,...,an)使得ans最大。

我以为写出方程形式会有助于做题,然并卵。。。

这题还是要用直观的方法理解。。。

数形结合方法:

定理1:如果把一个向量的正方向和反方向都算上,那么最优解的n个向量必然在一个半平面内。

证明: 假设最优解中的n个向量不在一个半平面内,一定可以找到一个直线l,使得直线左右两边都存在向量,那么将直线l左边的向量都转变为其反向量,那么结果一定大于最优解。

定理2: 如果把一个向量的正方向和反方向都算上,并以对x正半轴夹角排序,则连续的n个向量必两两不同(即不会存在一个向量的正向量和反向量都存在的情况)。

证: 显然。

由这两个定理,那么这题就很好做了,把所有的(xi,yi)(-xi,-yi)都算上,然后进行极角排序,枚举连续的n个记录最大值即可。

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <math.h>
  5. #include <algorithm>
  6. using namespace std;
  7. #define N 110
  8. const double PI = acos(-1.0);// PI
  9.  
  10. struct node
  11. {
  12. int x,y;
  13. double ang;
  14. }g[*N];
  15.  
  16. double GetAngle(double x,double y)
  17. {
  18. double tmp=atan2(y,x);
  19. if(tmp<) tmp=*PI+tmp;
  20. return tmp;
  21. }
  22.  
  23. double dis(int x,int y)
  24. {
  25. return sqrt((double)x*x+(double)y*y);
  26. }
  27.  
  28. int cmp(node t1,node t2)
  29. {
  30. return t1.ang<t2.ang;
  31. }
  32.  
  33. //泥煤,完全想错了。。。
  34.  
  35. int main(int argc, const char * argv[]) {
  36. int n;
  37. while(scanf("%d",&n) && n)
  38. {
  39. int cnt=;
  40. for(int i=;i<n;i++)
  41. {
  42. int x,y;
  43. scanf("%d%d",&x,&y);
  44. g[cnt].x=x; g[cnt].y=y; g[cnt].ang=GetAngle(x, y);
  45. cnt++;
  46. g[cnt].x=-x; g[cnt].y=-y; g[cnt].ang=GetAngle(-x, -y);
  47. cnt++;
  48. }
  49. sort(g,g+cnt,cmp);
  50. int pi,pj;
  51. pi=;
  52. double ans=;
  53. for(;pi<cnt;pi++)
  54. {
  55. int x=,y=;
  56. pj=pi;
  57. for(int j=;j<n;j++)
  58. {
  59. x+=g[pj].x;
  60. y+=g[pj].y;
  61. pj=(pj+)%cnt;
  62. }
  63. ans=max(ans,dis(x,y));
  64. }
  65. /*
  66. ans*=10000;
  67. int tmp=((long long)ans)%10;
  68. ans/=10;
  69. if(tmp>5) ans++;
  70. ans/=1000;
  71. char strans[110];
  72. sprintf(strans,"%lf",ans);
  73. for(int i=0;i<100;i++)
  74. {
  75. if(strans[i] == '.')
  76. {
  77. printf("%c",strans[i]);
  78. for(int j=0;j<3;j++)
  79. {
  80. printf("%c",strans[i+1+j]);
  81. }
  82. break;
  83. }
  84. else printf("%c",strans[i]);
  85. }
  86. printf("\n");
  87. */
  88. printf("%.3lf\n",ans);
  89. }
  90. return ;
  91. }

PS:最后题目中说的四舍五入是扯淡,直接%.3lf即可。

UVALive 5873 (几何+思维)的更多相关文章

  1. UVALive.3708 Graveyard (思维题)

    UVALive.3708 Graveyard (思维题) 题意分析 这标题真悲伤,墓地. 在周长为1e4的圆周上等距分布着n个雕塑,现在要加入进来m个雕塑,最终还要使得这n+m个雕塑等距,那么原来的n ...

  2. LightOJ 1058 - Parallelogram Counting 几何思维

    http://www.lightoj.com/volume_showproblem.php?problem=1058 题意:给你顶点,问能够成多少个平行四边形. 思路:开始想使用长度来扫描有多少根,但 ...

  3. 几何+思维 Samara University ACM ICPC 2016-2017 Quarterfinal Qualification Contest K. Revenge of the Dragon

    题目链接:http://codeforces.com/gym/101149/problem/K 题目大意: 给你两个点a,b.一个人在a点,一个人在b点,b点的人要追杀a的点,他的跑步速度是a的两倍. ...

  4. UVALive - 6442 (思维题)

    题目链接:https://vjudge.net/contest/241341#problem/I 题目大意:给你一个有N个点等距的环,编号[0,N-1],然后有些点上有一个或多个硬币,通过移动这些硬币 ...

  5. UVALive - 6434 (思维题)

    题目链接:https://vjudge.net/contest/241341#problem/A 题目大意,给你n个数字,让你分成m组,每组的花费为每组的最大值-最小值,总的花费就是各组花费相加,要求 ...

  6. UVALive - 6439(思维题)

    题目链接:https://vjudge.net/contest/241341#problem/F 题目大意:给你一个字符串,你可以用任意单个字符代替其中的一个子串,使它形成一个回文串,要求形成的回文串 ...

  7. EOJ Monthly 2018.7 B.锐角三角形(数学几何+思维)

    描述 是否存在面积为S/2的整点锐角三角形?存在输出Yes并输出三个整点坐标,否则输出No. 注意如果存在输出的坐标必须在long long范围内. Input 第一行一个整数S(1<=S< ...

  8. [CodeForces]CodeForces 13D 几何 思维

    大致题意: 给出N个红点和M个蓝点,问可以有多少个红点构成的三角形,其内部不含有蓝点 假设我们现在枚举了一条线段(p[i],p[j]),我们可以记录线段下方满足(min(p[i].x,p[j].x)& ...

  9. UVALive - 6434 —(思维题)

    题意:给出了你由n个数组成的序列,让你将这个序列分为成m个集合,使得每一个集合的最大值减最小值的差相加最小.(如果某集合只有一个数字,则最大值减最小值为0) . 思路:首先我们不难想到,最优的分配方法 ...

随机推荐

  1. 使用Visual Studio的动态连接库创建通用数据库连接对话框

    1.在VS(此处文件夹文件以vs2010为例)安装文件夹下("%Visual Studio安装文件夹%/Common10/IDE/Microsoft.Data.ConnectionUI.Di ...

  2. 算法(第四版)学习笔记之java实现可以动态调整数组大小的栈

    下压(LIFO)栈:可以动态调整数组大小的实现 import java.util.Iterator; public class ResizingArrayStack<Item> imple ...

  3. Commons-VFS 使用SFTP

    http://pro.ctlok.com/2011/06/apache-commons-vfs-for-sftp.html

  4. hiredis学习整理

    hiredis安装 http://blog.csdn.net/aizquan/article/details/20777453 http://blog.csdn.net/zhwei_87/articl ...

  5. node.js 学习02

    读写文件中的路径问题 readFile()读取文件函数中的./(相对路径)这个参数,相对的是执行node命令的路径,而不是相对于正在执行的这个js文件来查找.为了解决这个问题: __dirname(两 ...

  6. 转:ios应用崩溃日志揭秘

    http://www.raywenderlich.com/zh-hans/30818/ios应用崩溃日志揭秘

  7. C#中怎样将List&lt;自己定义&gt;转为Json格式 及相关函数-DataContractJsonSerializer

    对C#和.net使用List<自己定义>和Json格式相互转化的方法进行总结 关于JSON的入门介绍见http://www.json.org/ ,或者百度,这里不赘述,只是通过以下的样例会 ...

  8. Mysql中处理1970年前的日期(unixtime为负数的情况)负数时间戳格式化

    客户扔过来一个bug,说是一个系统中对42岁以上的人的统计不正确,而41岁以下的人没有问题.眼睛瞟了一下托盘区里的日期,2012年3月26日,嗯,今年42岁的话,那么应该就是出生在1970年左右,马上 ...

  9. (转)NSString to string(支持中文)

    NSString to string const char* destDir = [filepath UTF8String]; string a=destDir; string to NSString ...

  10. 时间序列 R 读书笔记 04 Forecasting: principles and practice

    本章開始学习<Forecasting: principles and practice> 1 getting started 1.1 事件的可预言性 一个时间能不能被预言主要取决于以下三点 ...