精度误差?! 题目给定一个整数n你需要构造一个集合S该集合由不超过2n2个不同的点组成这些点位于三维欧几里得空间中使得对于每个点P ∈S恰好有n个不同的点Q∈S 满足dis(P,Q)1其中dis(P,Q) 是点 P 和点 Q 之间的欧几里得距离。为了容忍精度误差设ϵ0.01只有在满足以下条件时你的答案才会被视为正确• 对于任何两个不同的点P,Q∈Sdis(P,Q)ϵ• 对于每个点P ∈S恰好有n个不同的点Q∈S满足1−ϵdis(P,Q)1ϵInput输入的第一行包含一个整数T (1≤T ≤100)表示测试数据组数。对于每组测试数据仅有一行包含一个整数n(1≤n≤100)。Output对于每组测试数据第一行输出一个整数m(1≤m≤2n2)表示集合S 中点的数量。接下来输出m行每行包含三个实数xy和z(−100≤x,y,z≤100)表示集合S 中一个点的坐标。可以证明在给定限制条件下总是存在可行解如果有多种可行解你可以输出任意一个https://ac.nowcoder.com/acm/contest/133876/G对于dis(P,Q)1考虑两个相距为1的平行平面设为平面A和B。对于位于一对合法点a,b分别位于平面A和B则dis(a,b)根号下(1x的平方)其中x为水平偏移量。所以x的极限值大概为0.14。所以对于点b合法的点集合为以a为圆心x为半径的圆圆上圆内均为合法点。关键点如果把点分为两组数量都为n分别放在z0,z1两个平面上则每个点在另一个平面都有符合题目条件的n个点且这些点都位于一个圆上。两点的最大水平偏移量为rArB需满足小于等于x。为了方便后续计算令两个圆相等。对于同一平面内的点距离最大为2*r0.14远小于1-e保证了题目要求的n点全部来自另一个平面题目中n最大为100需要在圆内找到100个点。考虑10×10的正方形网格两点间距为d0.011(略大于e0.01)。正方形上最远的两个点距离为对角线长度需小于等于圆的直径9 * d * (根号2)约等于0.139986(0.14)所以该正方形网格是合法的。设正方形左上角坐标为(0,0)则其他点坐标为(i * d,j * d)代码如下#includebits/stdc.husingnamespacestd;#defineintlonglong#defineinf1e18constdoubled0.011;vectorpairdouble,doublepoint;voidinit()//预处理出正方形网格上的点{for(inti0;i10;i){for(intj0;j10;j){point.push_back({i*d,j*d});}}}voidsolve(){intn;cinn;cout2*nendl;for(inti0;in;i){coutpoint[i].first point[i].second 0.000000000endl;coutpoint[i].first point[i].second 1.000000000endl;}}signedmain(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);intT1;cinT;coutfixedsetprecision(9);init();while(T--){solve();}return0;}

本月热点