POJ1569 Myacm Triangles
Description

There has been considerable archeological work on the ancient Myacm culture. Many artifacts have been found in what have been called power fields: a fairly small area, less than 100 meters square where there are from four to fifteen tall monuments with crystals on top. Such an area is mapped out above. Most of the artifacts discovered have come from inside a triangular area between just three of the monuments, now called the power triangle. After considerable analysis archeologists agree how this triangle is selected from all the triangles with three monuments as vertices: it is the triangle with the largest possible area that does not contain any other monuments inside the triangle or on an edge of the triangle. Each field contains only one such triangle.
Archeological teams are continuing to find more power fields. They would like to automate the task of locating the power triangles in power fields. Write a program that takes the positions of the monuments in any number of power fields as input and determines the power triangle for each power field.
A useful formula: the area of a triangle with vertices (x1, y1), (x2, y2), and (x3, y3) is the absolute value of
0.5 * [(y3 - y1)(x2 - x1) - (y2 - y1)(x3 - x1)].
Input
There is at least one such power field described. The end of input is indicated by a 0 for the number of monuments. The first sample data below corresponds to the diagram in the problem.
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++』
#include <iostream>
#include <cmath>
#include <algorithm>
#include <stdlib.h>
using namespace std; struct Vector {
double x, y;
Vector() :x(), y() {}
Vector(double xx, double yy) :
x(xx), y(yy) {}
}pts[]; int n; double operator ^(const Vector &v1, const Vector &v2) {
return v1.x * v2.y - v1.y * v2.x;
} Vector operator -(const Vector &v1, const Vector &v2) {
return Vector(v1.x - v2.x, v1.y - v2.y);
} double Area(const Vector &A, const Vector &B, const Vector &C) {
return fabs(0.5 * ((B - A) ^ (C - A)));
} bool InTriangle(const Vector &A, const Vector &B,
const Vector &C, const Vector &P) {
double d1 = (A - B) ^ (P - B);
double d2 = (B - C) ^ (P - C);
double d3 = (C - A) ^ (P - A); if ((d1 >= && d2 >= && d3 >= ) ||
(d1 <= && d2 <= && d3 <= ))
return true;
return false;
} bool Check(int pn1, int pn2, int pn3) {
for (int i = ; i < n; i++) {
if (i == pn1 || i == pn2 || i == pn3)
continue;
if (InTriangle(pts[pn1], pts[pn2], pts[pn3], pts[i]))
return false;
}
return true;
} int main()
{
while (scanf_s("%d", &n) == && n) {
if (n == )break; double ans = ;
int num[] = {}; for (int i = ; i < n; i++) {
char c;
cin >> c >> pts[i].x >> pts[i].y;
} for(int i = ; i < n; i++)
for(int j = i + ; j < n; j++)
for(int k = j+; k < n; k++)
if (Check(i, j, k)) {
double area = Area(pts[i], pts[j], pts[k]);
if (ans < area) {
ans = area;
num[] = i;
num[] = j;
num[] = k;
}
} printf("%c%c%c\n", 'A' + num[], 'A' + num[], 'A' + num[]);
} //system("pause");
return ;
}
POJ1569 Myacm Triangles的更多相关文章
- ACM学习历程——UVA10112 Myacm Triangles(计算几何,多边形与点的包含关系)
Description Problem B: Myacm Triangles Problem B: Myacm Triangles Source file: triangle.{c, cpp, j ...
- UVA题目分类
题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...
- HOJ题目分类
各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...
- Count the number of possible triangles
From: http://www.geeksforgeeks.org/find-number-of-triangles-possible/ Given an unsorted array of pos ...
- [ACM_搜索] Triangles(POJ1471,简单搜索,注意细节)
Description It is always very nice to have little brothers or sisters. You can tease them, lock them ...
- acdream.Triangles(数学推导)
Triangles Time Limit:1000MS Memory Limit:64000KB 64bit IO Format:%lld & %llu Submit Stat ...
- UVA 12651 Triangles
You will be given N points on a circle. You must write a program to determine how many distinctequil ...
- Codeforces Gym 100015F Fighting for Triangles 状压DP
Fighting for Triangles 题目连接: http://codeforces.com/gym/100015/attachments Description Andy and Ralph ...
- Codeforces Round #309 (Div. 1) C. Love Triangles dfs
C. Love Triangles Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/553/pro ...
随机推荐
- XSS/XSRF
一.XSS 1.1 xss的含义 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为 ...
- animation特效
在小程序中的使用: <view class='test1'> <image src='/images/light.png'></image> </view&g ...
- C++解析八-多态
多态多态按字面的意思就是多种形态.当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态.C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数.下面的实例中,基类 Sh ...
- layui布局器网站工具
http://layuiout.magicalcoder.com/magicaldrag-admin/drag
- AndroidStudio连不上Android设备真机
AndroidStudio连不上Android设备真机 刚好遇到这个问题,查阅了很多资料,看到有人分享了引起该问题的几个原因,我总结了一下: 1.手机设置问题.开USB调试 方法:手机设置-开发人员调 ...
- go web framework gin 路由表的设计
在上一篇go web framework gin 启动流程分析这一篇文章中,我分析了go gin启动的过程,在这一篇文章中我将继续上面的分析,讨论gin 中路由表是如何设计的? 首先查看engine. ...
- setTimeout中调用this
项目案例: 左右切换tab容器的动作,封装到一个对象中: var slidingComp = { startX : 0 , moveX : 0 , ...... start : function(e) ...
- VMware网络连接模式——桥接模式、NAT模式以及仅主机模式的介绍和区别
在使用VMware Workstation(以下简称:VMware)创建虚拟机的过程中,配置虚拟机的网络连接是非常重要的一环,当我们为虚拟机配置网络连接时,我们可以看到如下图所示的几种网络连接模式:桥 ...
- nginx——控制 Nginx 并发连接数
1. 限制单个 IP 的并发连接数 .... http { include mime.types; default_type application/octet-stream; sendfile on ...
- java.lang.ClassNotFoundException:oracle.jdbc.OracleDriver
在使用JDBC时经常碰到java.lang.ClassNotFoundException:oracle.jdbc.OracleDriver问题 这是jvm找不到驱动类文件,可能是以下原因: 没有导入驱 ...