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; }