Engines AtCoder - 4900

Engines

Problem Statement

 

E869120 is initially standing at the origin (0,0) in a two-dimensional plane.

He has N engines, which can be used as follows:

  • When E869120 uses the i-th engine, his X- and Y-coordinate change by xi and yi, respectively. In other words, if E869120 uses the i-th engine from coordinates (X,Y), he will move to the coordinates (X+xi,Y+yi).
  • E869120 can use these engines in any order, but each engine can be used at most once. He may also choose not to use some of the engines.

He wants to go as far as possible from the origin. Let (X,Y) be his final coordinates. Find the maximum possible value of √X2+Y2 , the distance from the origin.

Constraints

 

  • 1≤N≤100
  • −1 000 000≤xi≤1 000 000
  • −1 000 000≤yi≤1 000 000
  • All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
x1 y1
x2 y2
 : :
xN yN

Output

 

Print the maximum possible final distance from the origin, as a real value. Your output is considered correct when the relative or absolute error from the true answer is at most 10−10.

Sample Input 1

 

3
0 10
5 -5
-5 -5

Sample Output 1

 

10.000000000000000000000000000000000000000000000000

The final distance from the origin can be 10 if we use the engines in one of the following three ways:

  • Use Engine 1 to move to (0,10).
  • Use Engine 2 to move to (5,−5), and then use Engine 3 to move to (0,−10).
  • Use Engine 3 to move to (−5,−5), and then use Engine 2 to move to (0,−10).

The distance cannot be greater than 10, so the maximum possible distance is 10.

Sample Input 2

 

5
1 1
1 0
0 1
-1 0
0 -1

Sample Output 2

 

2.828427124746190097603377448419396157139343750753

The maximum possible final distance is 2√2 =2.82842…. One of the ways to achieve it is:

  • Use Engine 1 to move to (1,1), and then use Engine 2 to move to (2,1), and finally use Engine 3 to move to (2,2).

Sample Input 3

 

5
1 1
2 2
3 3
4 4
5 5

Sample Output 3

 

21.213203435596425732025330863145471178545078130654

If we use all the engines in the order 1→2→3→4→5, we will end up at (15,15), with the distance 15√2 =21.2132… from the origin.

Sample Input 4

 

3
0 0
0 1
1 0

Sample Output 4

 

1.414213562373095048801688724209698078569671875376

There can be useless engines with (xi,yi)=(0,0).

Sample Input 5

 

1
90447 91000

Sample Output 5

128303.000000000000000000000000000000000000000000000000

Note that there can be only one engine.

Sample Input 6

 

2
96000 -72000
-72000 54000

Sample Output 6

 

120000.000000000000000000000000000000000000000000000000

There can be only two engines, too.

Sample Input 7

 

10
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
19 20

Sample Output 7

 

148.660687473185055226120082139313966514489855137208

题意:给定一串方向向量,求出这些向量可以达到的最大的向量。

思路:先将这些方向向量用极角进行排序,(因为向量和是一个一个相加的,只有按照顺序将他们进行排列,使他们相邻的两个向量都更加利于达到最大的向量)然后进行暴力遍历,得出最大向量。

(输出只要求达到10的-10次方)妙啊

 

#include<iostream>
#include<cmath> 
#include<algorithm>
#include<cstdio>
using namespace std;
typedef long long ll;

struct node{
	ll x,y;
	
}r[1010];
bool cmp(node a,node b){
		return atan2(a.x,a.y) < atan2(b.x,b.y);//atan2:斜角计算函数 
	}
int main(){
	ll n,x,y;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>r[i].x>>r[i].y;
	}
	ll ans=0;
	sort(r,r+n,cmp);//只有按照极角排序之后才能保证可以达到最大的向量和是最大的。 
	for(int i=0;i<n;i++){
		x=r[i].x;
		y=r[i].y;
		ans=max(ans,x*x+y*y);
		for(int j=(i+1)%n;j!=i;j=(j+1)%n){
			x+=r[j].x;
			y+=r[j].y;
			ans=max(ans,x*x+y*y);
		}
	}
//	cout<<ans<<endl;
	double ans1=sqrt(ans);
	printf("%.13lf\n",ans1);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值