题目链接:http://acm.swust.edu.cn/problem/567/

Time limit(ms): 1000      Memory limit(kb): 65535
 
一只老虎自从看了<越狱>以来,脾气就比较暴躁,而且变得神神秘密的.一天管理员发现老虎不见了,这下他可急坏了,赶紧通知了110.幸好这只老虎身上装了GPS,所以还有希望找到他. 
你的任务就是通过GPS给出的老虎的坐标和笼子的坐标来让电脑计算出老虎的位置,是躲在洞里了,还是跑到外面去了.

Description
输入数据有N+2行: 
第一行是一个数据N(0<=N<=12),代表了笼子的坐标X,Y的个数(X,Y都在INT范围内); 
第二到N+1行是N个坐标X,Y,依次按从下逆时针的顺序来给出的. 
最后一行是老虎的坐标X,Y;

注:只有一组测试数据,输入的都是整数,笼子一定是凸多边形,而且老虎也不会出现在笼子边界上

三角形的面积可以用向量的外积来计算,那么多边形是N个三角形,那么就可以。。。。。

Input
如果老虎还在笼子里,输入"YES",否则是"NO";

Output
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
4
0 0
1 0
1 1
0 1
0.5 0.5
 
6
1 -1
2 0
1 1
-1 1
-2 0
-1 -1
3 3
Sample Input
1
2
YES
NO
Sample Output
 
解题思路:这道题看上去可能会以为是一个很坑的数学问题,但是仔细读题就会发现
     这道题其实就是比较笼子构成的凸包面积,和加入老虎坐标新的点集构成的新凸包的面积
     是否相等的题,相等即老虎在笼子内,反之亦然~~
     关于凸包的问题,可以戳戳这里:http://www.cnblogs.com/zyxStar/p/4540984.html
 
代码如下:
 //只需要判断加入该点凸包面积,和笼子构成凸包面积是否相等即可

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<cmath>
using namespace std;
struct node{
double x, y;
}point[], tiger[], posA, posB, tmp;//posB老虎基准量 double dis(node a, node b){
return pow((a.x - b.y), ) + pow((a.y - b.y), );
} //按点集分布排序,利用向量平行关系判断
bool cmp(node a, node b){
double povit = (a.x - posA.x)*(b.y - posA.y) - (b.x - posA.x)*(a.y - posA.y);
if (povit > || !povit && (dis(a, posA) < dis(b, posA)))
return true;
return false;
} //当前点是否在点集左侧,利用叉乘比较3个点两条线的斜率关系
bool turn_left(node p1, node p2, node p3){
return (p2.x*p1.y + p3.x*p2.y + p1.x*p3.y - p3.x*p1.y - p1.x*p2.y - p2.x*p3.y) > ? true : false;
} int main(){
int i, sign1, sign2, n;
double area1, area2;
cin >> n;
for (i = ; i < n; i++){
cin >> point[i].x >> point[i].y;
tiger[i].x = point[i].x;
tiger[i].y = point[i].y;
}
cin >> tiger[i].x >> tiger[i].y;//老虎坐标
stack<node> Q;
sign1 = ;
posA = posB = point[];
//分别找到笼子,加入老虎坐标 的点集的最左下的点
for (i = ; i < n + ; i++){
if (i<n){
if (posA.y == point[i].y&&posA.x>point[i].x || point[i].y < posA.y){
posA = point[i];
sign1 = i;
}
}
else{
posB = posA;
sign2 = sign1;
if (posB.y == tiger[i].y&&posB.x>tiger[i].x || tiger[i].y < posB.y){
posB = tiger[i];
sign2 = i;
}
}
}
swap(point[], point[sign1]);
swap(tiger[], tiger[sign2]);
sort(point + , point + n, cmp);//利用叉乘按点集离散化,方便筛选构成图凸包有效的点
sort(tiger + , tiger + n + , cmp);
Q.push(tiger[]), Q.push(tiger[]), Q.push(tiger[]); for (i = ; i < n + ; i++){
while (!Q.empty()){
tmp = Q.top();
Q.pop();
if (turn_left(tmp, Q.top(), tiger[i])){
Q.push(tmp);
break;
}
}
Q.push(tiger[i]);
}
//由于给出笼子必为凸包,直接计算面积
area1 = area2 = ;
tmp = point[n - ];
area1 += (posA.x*tmp.y - posA.y*tmp.x) / 2.0;
for (i = n - ; i >= ; i--){
area1 += (tmp.x*point[i].y - tmp.y*point[i].x) / 2.0;
tmp = point[i];
} tmp = Q.top(), Q.pop();
area2 += (posA.x*tmp.y - posA.y*tmp.x) / 2.0;
while (!Q.empty()){
area2 += (tmp.x*Q.top().y - tmp.y*Q.top().x) / 2.0;
tmp = Q.top();
Q.pop();
}
printf("%s\n", area1 == area2 ? "YES" : "NO");
return ;
}
 

[Swust OJ 567]--老虎在不在笼子里(凸包问题)的更多相关文章

  1. [Swust OJ 404]--最小代价树(动态规划)

    题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535   Des ...

  2. [Swust OJ 649]--NBA Finals(dp,后台略(hen)坑)

    题目链接:http://acm.swust.edu.cn/problem/649/ Time limit(ms): 1000 Memory limit(kb): 65535 Consider two ...

  3. SWUST OJ NBA Finals(0649)

    NBA Finals(0649) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 404 Accepted: 128   Descri ...

  4. OJ提交题目中的语言选项里G++与C++的区别

    一.OJ提交题目中的语言选项里G++与C++的区别 http://www.th7.cn/Program/cp/201405/199001.shtml 首先更正一个概念,C++是一门计算机编程语言,G+ ...

  5. [Swust OJ 1023]--Escape(带点其他状态的BFS)

    解题思路:http://acm.swust.edu.cn/problem/1023/ Time limit(ms): 5000 Memory limit(kb): 65535     Descript ...

  6. [Swust OJ 1125]--又见GCD(数论,素数表存贮因子)

    题目链接:http://acm.swust.edu.cn/problem/1125/ Time limit(ms): 1000 Memory limit(kb): 65535   Descriptio ...

  7. [Swust OJ 1126]--神奇的矩阵(BFS,预处理,打表)

    题目链接:http://acm.swust.edu.cn/problem/1126/ Time limit(ms): 1000 Memory limit(kb): 65535 上一周里,患有XX症的哈 ...

  8. [Swust OJ 1026]--Egg pain's hzf

      题目链接:http://acm.swust.edu.cn/problem/1026/     Time limit(ms): 3000 Memory limit(kb): 65535   hzf ...

  9. [Swust OJ 1139]--Coin-row problem

    题目链接:  http://acm.swust.edu.cn/contest/0226/problem/1139/ There is a row of n coins whose values are ...

随机推荐

  1. 关于jq操作table下多个type=radio的input的选中

    假如有2个table: <table id="table1" border="0"> <tr> <td><input ...

  2. 编写带参数decorator

    无参的@log装饰器: def log(f): def fn(x): print 'call ' + f.__name__ + '()...' return f(x) return fn 发现对于被装 ...

  3. Access2007中如何运行SQL执行SQl语句

    1. 在“创建”选项卡中,单击“其他”组中的“查询设计”. 2. 单击“显示表”对话框中的“关闭”,而不添加任何表或查询. 3. 在“设计”选项卡中,单击“查询类型”工作组中的“联合”. 4. 单击“ ...

  4. QString类的使用(无所不包,极其方便)

    Qt的QString类提供了很方便的对字符串操作的接口. 使某个字符填满字符串,也就是说字符串里的所有字符都有等长度的ch来代替. QString::fill ( QChar ch, int size ...

  5. installscript类型 完成时实现推荐安装其他产品的功能

    目前好多软件在安装完成时都有什么 立刻运行.打开网址.推荐安装其他工具等功能 我司领导也追时髦要求了这个功能而且要推荐多个,所以这个功能实现起来就需要自己去写代码了.陆陆续续研究了研究了好长时间,由于 ...

  6. 使用Win32 API创建不规则形状&带透明色的窗口

    前一阵突然想起了9月份电面某公司实习时的二面题,大概就是说怎么用Win32 API实现一个透明的窗口,估计当时我的脑残答案肯定让面试官哭笑不得吧.所以本人决定好好研究下这个问题.经过一下午的摸索,基本 ...

  7. python(进程池/线程池)

    进程池 import multiprocessing import time def do_calculation(data): print(multiprocessing.current_proce ...

  8. 《数字图像处理原理与实践(MATLAB版)》一书之代码Part6

    本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part6,辑录该书第281至第374页之代码,供有须要读者下载研究使用.代码运行结果请參见原书配图,建议下载代码前阅读下 ...

  9. Silverlight CheckBoxList

    项目要用到复选框,可是在Silverlight中不存在CheckBoxList.通过查阅资料以及依据自己的理解,写了简单演示样例: 1.XAML <UserControl x:Class=&qu ...

  10. leetcode第一刷_Path Sum II

    在更新上面一道题的时候我就想,是不是另一道打印路径的,果不其然啊. 这样的题非经常见的,做法也非常easy,我是用一个引用的vector来存,满足条件之后直接压入结果集中,当然也能够用数组之类的,都一 ...