题目大意:
给出平面上
n(3≤n≤8)
个点,每个点有一个坐标
(
未知
)
和正整数权值
Ri
,其中
Rn?1=Rn
,给出一组坐标构造,使得任意三个点构成的三角形面积为这三个点的权值和。
分析:
我们以最后两个有相等权值的点为基来考虑。
满足条件的一组构造必定满足如下条件:
1.
因为权值均为正整数,所以没有三点共线;
2.
构造必定形如:
vcz1xr3Q0M/fyc+31rHwyM7IodK7uPa146Os1eLBvbj2tePBrM/fts6x2Ln9PG5vYnI+Um4/MSxSbjwvbm9icj61xNbQteOhozxiciAvPg0KPG5vYnI+IDwvbm9icj7X28nPy/nK9qOstbE8bm9icj5uJmd0OzQ8L25vYnI+yrGjrNK7tqjO3r3io7s8YnIgLz4NCjxub2JyPiA8L25vYnI+tbE8bm9icj5uPTQ8L25vYnI+yrGjrMj0PG5vYnI+UjErUjI9UjMrUjQ8L25vYnI+o6zEx8O0v8nS1LDRPG5vYnI+UjEsUjI8L25vYnI+yc/PwrfFo7s8YnIgLz4NCjxub2JyPiA8L25vYnI+yPQ8bm9icj5SMT1SMjwvbm9icj6jrL/J0tTBvbj2try3xcnPw+ajuzxiciAvPg0KPG5vYnI+IDwvbm9icj638dTyzt694qO7PGJyIC8+DQo8bm9icj4gPC9ub2JyPrWxPG5vYnI+bj0zPC9ub2JyPsqxo6zSu7ao09C94qOsy+ax47m51Oy8tL/JoaM8L3A+DQo8cD5BQyBjb2Rlo7o8L3A+DQo8cHJlIGNsYXNzPQ=="brush:java;"> #include
#include
typedef double DB; using namespace std; const int MAXN = 5; const DB eps = 1e-8; int n; DB a[MAXN]; int main() { #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif scanf("%d", &n); if(n > 4) puts("NO"); else { for(int i = 1; i <= n; ++i) scanf("%lf", a+i); if(n == 4) { if(fabs(a[1]+a[2]-a[3]-a[4]) > eps) { if(fabs(a[1]-a[2]) > eps) puts("NO"); else { DB x3 = -10, x4 = 10, x, y; y = (a[1]+a[3]+a[4])*2/(x4-x3); x = (a[1]+a[2]+a[3])*2/y; puts("YES"); printf("%.4lf %.4lf\n", -x/2, y); printf("%.4lf %.4lf\n", x/2, y); printf("%.4lf 0.0000\n", x3); printf("%.4lf 0.0000\n", x4); } } else { DB x3 = -10, x4 = 10, y1, y2; y1 = (a[1]+a[3]+a[4])*2/(x4-x3); y2 = -(a[2]+a[3]+a[4])*2/(x4-x3); puts("YES"); printf("0.0000 %.4lf\n", y1); printf("0.0000 %.4lf\n", y2); printf("%.4lf 0.0000\n", x3); printf("%.4lf 0.0000\n", x4); } } else { DB x2 = -10, x3 = 10, y1; y1 = (a[1]+a[2]+a[3])*2/(x3-x2); puts("YES"); printf("0.0000 %.4lf\n", y1); printf("%.4lf 0.0000\n", x2); printf("%.4lf 0.0000\n", x3); } } #ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout); #endif return 0; }