HDU4216 Computational Geometry?

题意:已知炸弹的坐标,n个向量(n<100),从原点出发,每个向量可以走正向或者反向,找到一条路,使得路上离炸弹最远的点的距离最大,问最大距离

题解:要求最远距离,也就是向量要尽量取同一方向才能更远,可以枚举方向,算出最大的就是答案

#include <bits/stdc++.h>
#define maxn 100
#define PI 3.14159265358979323846
#define Vector Point
using namespace std;
typedef long long ll;
struct Point {
    double x, y;
}a[maxn], c, e, b;
int main(){
    int T, ca = 1, n;
    double ma;
    scanf("%d", &T);
    while(T--){
        scanf("%d%lf%lf", &n, &c.x, &c.y);
        for(int i=0;i<n;i++) scanf("%lf%lf", &a[i].x, &a[i].y);
        ma = 0;
        for(int j=0;j<360;j+=2){
            b.x=b.y=0;
            e.y = sin(2*PI/360*j);
            e.x = cos(2*PI/360*j);
            for(int i=0;i<n;i++){
                if(e.x*a[i].x+e.y*a[i].y >= 0) b.x-=a[i].x,b.y-=a[i].y;
                else b.x+=a[i].x,b.y+=a[i].y;
                ma = max(ma, (b.x-c.x)*(b.x-c.x)+(b.y-c.y)*(b.y-c.y));
            }
        }
        printf("Case %d: %.3f\n", ca++, sqrt(ma));
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Noevon/p/8981932.html