【百度春招】寻找三角形

来源:互联网 发布:中国知名网站知乎 编辑:程序博客网 时间: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


[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include<iostream>    
  2. #include<algorithm>    
  3. #include<unordered_map>  
  4. #include<cmath>  
  5. #include<string>  
  6. #include<vector>    
  7. using namespace std;  
  8.   
  9. double juli(vector<int>a, vector<int>b) {   //计算两点之间的距离
  10.     int a1 = a[0] - b[0];  
  11.     int a2 = a[1] - b[1];  
  12.     int a3 = a[2] - b[2];  
  13.     return sqrt((1.0*a1*a1) + (1.0*a2*a2) + (1.0*a3*a3));  
  14. }  
  15. double space(vector<int>a, vector<int>b, vector<int>c) {    //海伦公式,计算三角形面积
  16.     double a1 = juli(a, b);  
  17.     double a2 = juli(a, c);  
  18.     double a3 = juli(b, c);  
  19.     double p = (a1 + a2 + a3) / 2.0;  
  20.     return sqrt(1.0*p*(p - a1)*(p - a2)*(p - a3));  
  21. }  
  22. int main() {   
  23.     int N; cin >> N;  
  24.     double result = 0;  
  25.     vector<vector<int>>R;  
  26.     vector<vector<int>>G;  
  27.     vector<vector<int>>B;  
  28.     while (N--) {  
  29.         char temp; vector<int>a(3,0);  
  30.         cin >> temp>>a[0]>>a[1]>>a[2];  
  31.         if (temp == 'R')R.push_back(a);  
  32.         else if (temp == 'G')G.push_back(a);  
  33.         else if (temp == 'B')B.push_back(a);      
  34.     }  
  35.     if (R.size() >= 3) {  
  36.         for (int i = 0; i < R.size() - 2; ++i) {  
  37.             for (int j = i + 1; j < R.size() - 1; ++j) {  
  38.                 for (int z = j + 1; z < R.size(); ++z) {  
  39.                     result = std::max(result, space(R[i], R[j], R[z]));  
  40.                 }  
  41.             }  
  42.         }  
  43.     }  
  44.     if (G.size() >= 3) {  
  45.         for (int i = 0; i < G.size() - 2; ++i) {  
  46.             for (int j = i + 1; j < G.size() - 1; ++j) {  
  47.                 for (int z = j + 1; z < G.size(); ++z) {  
  48.                     result = std::max(result, space(G[i],G[j], G[z]));  
  49.                 }  
  50.             }  
  51.         }  
  52.     }  
  53.     if (B.size() >= 3) {  
  54.         for (int i = 0; i < B.size() - 2; ++i) {  
  55.             for (int j = i + 1; j <B.size() - 1; ++j) {  
  56.                 for (int z = j + 1; z < B.size(); ++z) {  
  57.                     result = std::max(result, space(B[i], B[j], B[z]));  
  58.                 }  
  59.             }  
  60.         }  
  61.     }  
  62.     if (R.size() && G.size() && B.size()) {    //三种颜色都不相同
  63.         for (int i = 0; i < R.size(); ++i) {  
  64.             for (int j = 0; j < G.size(); ++j) {  
  65.                 for (int z = 0; z < B.size(); ++z) {  
  66.                     result = max(result, space(R[i], G[j], B[z]));  
  67.                   
  68.                 }  
  69.               
  70.             }  
  71.         }  
  72.     }  
  73.     printf("%.5f", result);  
  74. //  system("pause");  
  75. }  
1 0
原创粉丝点击