UVALive 5873 (几何+思维)
唉 被秀了。。。 还是太弱,说好的数形结合呢,列个式子出来后就被吓到了,然后就懵逼了。
题意:
有一条狗,从原点出发,沿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个记录最大值即可。
- #include <iostream>
- #include <stdio.h>
- #include <string.h>
- #include <math.h>
- #include <algorithm>
- using namespace std;
- #define N 110
- const double PI = acos(-1.0);// PI
- struct node
- {
- int x,y;
- double ang;
- }g[*N];
- double GetAngle(double x,double y)
- {
- double tmp=atan2(y,x);
- if(tmp<) tmp=*PI+tmp;
- return tmp;
- }
- double dis(int x,int y)
- {
- return sqrt((double)x*x+(double)y*y);
- }
- int cmp(node t1,node t2)
- {
- return t1.ang<t2.ang;
- }
- //泥煤,完全想错了。。。
- int main(int argc, const char * argv[]) {
- int n;
- while(scanf("%d",&n) && n)
- {
- int cnt=;
- for(int i=;i<n;i++)
- {
- int x,y;
- scanf("%d%d",&x,&y);
- g[cnt].x=x; g[cnt].y=y; g[cnt].ang=GetAngle(x, y);
- cnt++;
- g[cnt].x=-x; g[cnt].y=-y; g[cnt].ang=GetAngle(-x, -y);
- cnt++;
- }
- sort(g,g+cnt,cmp);
- int pi,pj;
- pi=;
- double ans=;
- for(;pi<cnt;pi++)
- {
- int x=,y=;
- pj=pi;
- for(int j=;j<n;j++)
- {
- x+=g[pj].x;
- y+=g[pj].y;
- pj=(pj+)%cnt;
- }
- ans=max(ans,dis(x,y));
- }
- /*
- ans*=10000;
- int tmp=((long long)ans)%10;
- ans/=10;
- if(tmp>5) ans++;
- ans/=1000;
- char strans[110];
- sprintf(strans,"%lf",ans);
- for(int i=0;i<100;i++)
- {
- if(strans[i] == '.')
- {
- printf("%c",strans[i]);
- for(int j=0;j<3;j++)
- {
- printf("%c",strans[i+1+j]);
- }
- break;
- }
- else printf("%c",strans[i]);
- }
- printf("\n");
- */
- printf("%.3lf\n",ans);
- }
- return ;
- }
PS:最后题目中说的四舍五入是扯淡,直接%.3lf即可。
UVALive 5873 (几何+思维)的更多相关文章
- UVALive.3708 Graveyard (思维题)
UVALive.3708 Graveyard (思维题) 题意分析 这标题真悲伤,墓地. 在周长为1e4的圆周上等距分布着n个雕塑,现在要加入进来m个雕塑,最终还要使得这n+m个雕塑等距,那么原来的n ...
- LightOJ 1058 - Parallelogram Counting 几何思维
http://www.lightoj.com/volume_showproblem.php?problem=1058 题意:给你顶点,问能够成多少个平行四边形. 思路:开始想使用长度来扫描有多少根,但 ...
- 几何+思维 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的两倍. ...
- UVALive - 6442 (思维题)
题目链接:https://vjudge.net/contest/241341#problem/I 题目大意:给你一个有N个点等距的环,编号[0,N-1],然后有些点上有一个或多个硬币,通过移动这些硬币 ...
- UVALive - 6434 (思维题)
题目链接:https://vjudge.net/contest/241341#problem/A 题目大意,给你n个数字,让你分成m组,每组的花费为每组的最大值-最小值,总的花费就是各组花费相加,要求 ...
- UVALive - 6439(思维题)
题目链接:https://vjudge.net/contest/241341#problem/F 题目大意:给你一个字符串,你可以用任意单个字符代替其中的一个子串,使它形成一个回文串,要求形成的回文串 ...
- EOJ Monthly 2018.7 B.锐角三角形(数学几何+思维)
描述 是否存在面积为S/2的整点锐角三角形?存在输出Yes并输出三个整点坐标,否则输出No. 注意如果存在输出的坐标必须在long long范围内. Input 第一行一个整数S(1<=S< ...
- [CodeForces]CodeForces 13D 几何 思维
大致题意: 给出N个红点和M个蓝点,问可以有多少个红点构成的三角形,其内部不含有蓝点 假设我们现在枚举了一条线段(p[i],p[j]),我们可以记录线段下方满足(min(p[i].x,p[j].x)& ...
- UVALive - 6434 —(思维题)
题意:给出了你由n个数组成的序列,让你将这个序列分为成m个集合,使得每一个集合的最大值减最小值的差相加最小.(如果某集合只有一个数字,则最大值减最小值为0) . 思路:首先我们不难想到,最优的分配方法 ...
随机推荐
- 使用Visual Studio的动态连接库创建通用数据库连接对话框
1.在VS(此处文件夹文件以vs2010为例)安装文件夹下("%Visual Studio安装文件夹%/Common10/IDE/Microsoft.Data.ConnectionUI.Di ...
- 算法(第四版)学习笔记之java实现可以动态调整数组大小的栈
下压(LIFO)栈:可以动态调整数组大小的实现 import java.util.Iterator; public class ResizingArrayStack<Item> imple ...
- Commons-VFS 使用SFTP
http://pro.ctlok.com/2011/06/apache-commons-vfs-for-sftp.html
- hiredis学习整理
hiredis安装 http://blog.csdn.net/aizquan/article/details/20777453 http://blog.csdn.net/zhwei_87/articl ...
- node.js 学习02
读写文件中的路径问题 readFile()读取文件函数中的./(相对路径)这个参数,相对的是执行node命令的路径,而不是相对于正在执行的这个js文件来查找.为了解决这个问题: __dirname(两 ...
- 转:ios应用崩溃日志揭秘
http://www.raywenderlich.com/zh-hans/30818/ios应用崩溃日志揭秘
- C#中怎样将List<自己定义>转为Json格式 及相关函数-DataContractJsonSerializer
对C#和.net使用List<自己定义>和Json格式相互转化的方法进行总结 关于JSON的入门介绍见http://www.json.org/ ,或者百度,这里不赘述,只是通过以下的样例会 ...
- Mysql中处理1970年前的日期(unixtime为负数的情况)负数时间戳格式化
客户扔过来一个bug,说是一个系统中对42岁以上的人的统计不正确,而41岁以下的人没有问题.眼睛瞟了一下托盘区里的日期,2012年3月26日,嗯,今年42岁的话,那么应该就是出生在1970年左右,马上 ...
- (转)NSString to string(支持中文)
NSString to string const char* destDir = [filepath UTF8String]; string a=destDir; string to NSString ...
- 时间序列 R 读书笔记 04 Forecasting: principles and practice
本章開始学习<Forecasting: principles and practice> 1 getting started 1.1 事件的可预言性 一个时间能不能被预言主要取决于以下三点 ...