标签:int src des algo disco not enter mes class
Description
Input
Output
Sample Input
6 A 1 0 B 4 0 C 0 3 D 1 3 E 4 4 F 0 6 4 A 0 0 B 1 0 C 99 0 D 99 99 0
Sample Output
BEF BCD
『题解』
题目大意是给一些点,这些点可以构成很多三角形。要在所有内部不含其它点的三角形中找出面积最大的。
枚举三角形的三个顶点a,b,c。主要问题在于如何判断三角形内没有其它的点。事实上,若点p在三角形abc内,则叉积(a - b) ^ (p - b),(b - c) ^ (p - c),(c - a) ^ (p - a)是同号的。此方法同样适用与判断点是否在凸多边形内。
三角形abc面积的求法题目给出了,用叉积|(a - b) ^ (c - b) / 2|。在满足条件的三角形中找面积最大的即可。
枚举三角形的三个顶点,对于每个三角形还要枚举判断内部是否包含其它点,因而时间复杂度为O(n ^ 4)。
『C++』
1 #include <iostream> 2 #include <cmath> 3 #include <algorithm> 4 #include <stdlib.h> 5 using namespace std; 6 7 struct Vector { 8 double x, y; 9 Vector() :x(0), y(0) {} 10 Vector(double xx, double yy) : 11 x(xx), y(yy) {} 12 }pts[50]; 13 14 int n; 15 16 double operator ^(const Vector &v1, const Vector &v2) { 17 return v1.x * v2.y - v1.y * v2.x; 18 } 19 20 Vector operator -(const Vector &v1, const Vector &v2) { 21 return Vector(v1.x - v2.x, v1.y - v2.y); 22 } 23 24 double Area(const Vector &A, const Vector &B, const Vector &C) { 25 return fabs(0.5 * ((B - A) ^ (C - A))); 26 } 27 28 bool InTriangle(const Vector &A, const Vector &B, 29 const Vector &C, const Vector &P) { 30 double d1 = (A - B) ^ (P - B); 31 double d2 = (B - C) ^ (P - C); 32 double d3 = (C - A) ^ (P - A); 33 34 if ((d1 >= 0 && d2 >= 0 && d3 >= 0) || 35 (d1 <= 0 && d2 <= 0 && d3 <= 0)) 36 return true; 37 return false; 38 } 39 40 bool Check(int pn1, int pn2, int pn3) { 41 for (int i = 0; i < n; i++) { 42 if (i == pn1 || i == pn2 || i == pn3) 43 continue; 44 if (InTriangle(pts[pn1], pts[pn2], pts[pn3], pts[i])) 45 return false; 46 } 47 return true; 48 } 49 50 int main() 51 { 52 while (scanf_s("%d", &n) == 1 && n) { 53 if (n == 0)break; 54 55 double ans = 0; 56 int num[3] = {}; 57 58 for (int i = 0; i < n; i++) { 59 char c; 60 cin >> c >> pts[i].x >> pts[i].y; 61 } 62 63 for(int i = 0; i < n; i++) 64 for(int j = i + 1; j < n; j++) 65 for(int k = j+1; k < n; k++) 66 if (Check(i, j, k)) { 67 double area = Area(pts[i], pts[j], pts[k]); 68 if (ans < area) { 69 ans = area; 70 num[0] = i; 71 num[1] = j; 72 num[2] = k; 73 } 74 } 75 76 printf("%c%c%c\n", ‘A‘ + num[0], ‘A‘ + num[1], ‘A‘ + num[2]); 77 } 78 79 //system("pause"); 80 return 0; 81 }
标签:int src des algo disco not enter mes class
原文地址:https://www.cnblogs.com/Jeffrey-Y/p/10293449.html