【百度春招】寻找三角形
来源:互联网 发布:中国知名网站知乎 编辑:程序博客网 时间:2024/05/16 05:37
时间限制:1秒
空间限制:32768K
三维空间中有N个点,每个点可能是三种颜色的其中之一,三种颜色分别是红绿蓝,分别用'R', 'G', 'B'表示。
现在要找出三个点,并组成一个三角形,使得这个三角形的面积最大。
但是三角形必须满足:三个点的颜色要么全部相同,要么全部不同。
输入描述:
首先输入一个正整数N三维坐标系内的点的个数.(N <= 50)
接下来N行,每一行输入 c x y z,c为'R', 'G', 'B' 的其中一个。x,y,z是该点的坐标。(坐标均是0到999之间的整数)
输出描述:
输出一个数表示最大的三角形面积,保留5位小数。
输入例子:
5
R 0 0 0
R 0 4 0
R 0 0 3
G 92 14 7
G 12 16 8
输出例子:
6.00000
- #include<iostream>
- #include<algorithm>
- #include<unordered_map>
- #include<cmath>
- #include<string>
- #include<vector>
- using namespace std;
-
- double juli(vector<int>a, vector<int>b) { //计算两点之间的距离
- int a1 = a[0] - b[0];
- int a2 = a[1] - b[1];
- int a3 = a[2] - b[2];
- return sqrt((1.0*a1*a1) + (1.0*a2*a2) + (1.0*a3*a3));
- }
- double space(vector<int>a, vector<int>b, vector<int>c) { //海伦公式,计算三角形面积
- double a1 = juli(a, b);
- double a2 = juli(a, c);
- double a3 = juli(b, c);
- double p = (a1 + a2 + a3) / 2.0;
- return sqrt(1.0*p*(p - a1)*(p - a2)*(p - a3));
- }
- int main() {
- int N; cin >> N;
- double result = 0;
- vector<vector<int>>R;
- vector<vector<int>>G;
- vector<vector<int>>B;
- while (N--) {
- char temp; vector<int>a(3,0);
- cin >> temp>>a[0]>>a[1]>>a[2];
- if (temp == 'R')R.push_back(a);
- else if (temp == 'G')G.push_back(a);
- else if (temp == 'B')B.push_back(a);
- }
- if (R.size() >= 3) {
- for (int i = 0; i < R.size() - 2; ++i) {
- for (int j = i + 1; j < R.size() - 1; ++j) {
- for (int z = j + 1; z < R.size(); ++z) {
- result = std::max(result, space(R[i], R[j], R[z]));
- }
- }
- }
- }
- if (G.size() >= 3) {
- for (int i = 0; i < G.size() - 2; ++i) {
- for (int j = i + 1; j < G.size() - 1; ++j) {
- for (int z = j + 1; z < G.size(); ++z) {
- result = std::max(result, space(G[i],G[j], G[z]));
- }
- }
- }
- }
- if (B.size() >= 3) {
- for (int i = 0; i < B.size() - 2; ++i) {
- for (int j = i + 1; j <B.size() - 1; ++j) {
- for (int z = j + 1; z < B.size(); ++z) {
- result = std::max(result, space(B[i], B[j], B[z]));
- }
- }
- }
- }
- if (R.size() && G.size() && B.size()) { //三种颜色都不相同
- for (int i = 0; i < R.size(); ++i) {
- for (int j = 0; j < G.size(); ++j) {
- for (int z = 0; z < B.size(); ++z) {
- result = max(result, space(R[i], G[j], B[z]));
-
- }
-
- }
- }
- }
- printf("%.5f", result);
-
- }
1 0