列表

详情


NC19779. 魔法阵

描述

小贝穿越到了一个魔法世界。这个世界有三个国家,每个国家都有一个神庙和一名祭司。每位祭司都能在任何地方从自己国家的神庙获取能量实施魔法,且距离圣地越近的地方魔法越强。
当外星人入侵的时候,三位祭司需要一起完成一个古老的魔法阵来抵御外敌,这个魔法阵要求三位祭司所在的位置构成一个正三角形。魔法阵的能量取决于三位祭司与对应神庙的距离的最大值,这个值越小则魔法阵的威力越强。
外星人过不久又要来入侵了,小贝要帮三位祭司找出最佳的位置,使得魔法阵的威力最大,否则她可能无法返回地球。小贝想要知道所有布阵方案中,三位祭司与对应神庙的距离的最大值最小是多少。

输入描述

数据有多组,第一行一个整数T表示数据组数。
每组数据三行,第i行有两个整数Xi, Yi,表示这组数据第i个圣地的位置。

输出描述

对于每组数据,输出形如"Case #x: y",其中 x 为这组数据的编号(从1开始),y为这组数据的答案。答案的绝对误差或相对误差在10-6以内都认为是正确的。

示例1

输入:

2
0 0
0 1
1 0
0 0
1 2
2 0

输出:

Case #1: 0.1725460301
Case #2: 0.0893163975

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 476K, 提交时间: 2018-10-13 10:47:41

#include <iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int mxm=4500;

int main() {
	int t;
	cin>>t;
	int p=0;
	while(t--){
        int x1,x2,x3,y1,y2,y3;
        cin>>x1>>y1;
        cin>>x2>>y2;
        cin>>x3>>y3;
        double x=(x1+x2+sqrt(3)*(y1-y2))/2;
        double y=(y1+y2-sqrt(3)*(x1-x2))/2;
        double ans=sqrt((x-x3)*(x-x3)+(y-y3)*(y-y3));
        x=(x1+x2-sqrt(3)*(y1-y2))/2;
        y=(y1+y2+sqrt(3)*(x1-x2))/2;
        ans=min(ans,sqrt((x-x3)*(x-x3)+(y-y3)*(y-y3)));
        cout<<"Case #"<<++p<<":";
        printf("%.8lf\n",ans/3);
	}
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 352K, 提交时间: 2018-10-02 17:23:10

#include<bits/stdc++.h>

using namespace std;

int T,cas;
double x[4],y[4];
double sqr(double x)
{
	return x*x;
}
int main()
{
	scanf("%d",&T);
	while (T--)
	{
		for (int i=0;i<3;i++)
			scanf("%lf %lf",&x[i],&y[i]);
		double ans=1e18;
		x[3]=(x[0]+x[1]-sqrt(3)*(y[0]-y[1]))/2;
		y[3]=(y[0]+y[1]+sqrt(3)*(x[0]-x[1]))/2;
		ans=min(ans,sqrt(sqr(x[2]-x[3])+sqr(y[2]-y[3])));
		x[3]=(x[0]+x[1]+sqrt(3)*(y[0]-y[1]))/2;
		y[3]=(y[0]+y[1]-sqrt(3)*(x[0]-x[1]))/2;
		ans=min(ans,sqrt(sqr(x[2]-x[3])+sqr(y[2]-y[3])));
		printf("Case #%d: %.10f\n",++cas, ans/3);
	}
	return 0;
}

上一题