题目描述
欢迎参加程序设计竞赛~
程序设计竞赛中有着很多有意思的问题,其中,与三角形有关的问题就经常出现。今天你要解决的,就是其中最简单的一个问题:
给定平面直角坐标系上的N个点,保证这N个点中任意三点都不共线。求任意三点能够构成的三角形中,面积最大的三角形的面积。
输入
输入的第一行是一个整数T(1 <= T <= 10),表示一共有T组用例。
每组用例的第一行为一个整数N(3 <= n <= 100),表示平面上点的个数。接下来的N行,每行包含两个用空格隔开的整数Xi和Yi(-1000 <= Xi, Yi <= 1000),表示第i个点的坐标(Xi, Yi)。
输出
每组用例输出一个数,表示最大的三角形的面积,结果保留一位小数。
输入样例
2
4
-1 1
1 1
1 -1
-1 -1
3
-1 -1
3 0
0 0
输出样例
2.0
1.5
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 无限制 | 64M | 0 |
#include <stdio.h>
#include <math.h>
int main() {
int T, N, i, j, k = 0, s, t, u, n, ss;
long a[101][3] = {};
float b[200000] = {}, max;
scanf("%d", &T);
for (i = 0; i < T; i++) {
scanf("%d", &N);
for (j = 0; j < N; j++) {
scanf("%d %d", &a[j][0], &a[j][1]);
}
for (s = 0; s < N - 2; s++) {
for (t = s + 1; t < N - 1; t++) {
for (u = t + 1; u < N; u++) {
ss = abs((a[t][0] - a[s][0]) * (a[u][1] - a[s][1]) - (a[u][0] - a[s][0]) * (a[t][1] - a[s][1]));
b[k++] = 0.5 * ss;
}
}
}
max = b[0];
for (n = 1; n < N * (N - 1) * (N - 2) / 6; n++) {
if (max < b[n])
max = b[n];
}
printf("%.1f\n", max);
for (int p = 0; p < 200000; p++)
b[p] = 0;
k = 0;
}
return 0;
}