首页 > 代码库 > cogs 1656. 膜拜神犇
cogs 1656. 膜拜神犇
1656. 膜拜神犇
★☆ 输入文件:trioxorz.in
输出文件:trioxorz.out
简单对比
时间限制:0.5 s 内存限制:128 MB
【题目描述】
bigmingod 是F.M.S信息组的组草,同时也是万人膜拜的神犇,整个年级暗恋他的女生不计其数,这让机房里的三只蒟蒻QYHDS,LZK,OIdiot羡慕嫉妒恨。为了获得像bigmingod一样的成就,这三只蒟蒻决定每次竞赛课前对他进行膜拜——三个人构成一个三角形,将bigmingod包围在内部(不包括边上),称为膜拜成功!
然而蒟蒻也许跟不上神犇的脚步,若没能包围bigmingod,则为膜拜失败。如图所示:
现在给你N次的膜拜情况,请你编程输出膜拜成功的次数。
【输入格式】
第一行为一个正整数N表示膜拜的次数。
以下N行,每行 6 个数字,x1,y1,x2,y2,x3,y3 即三角形顶点的坐标。
【输出格式】
一个整数,即膜拜成功的次数。
【样例输入】
3
-1 0 0 -1 0 1
-1 1 2 -2 1 2
-2 2 -1 -5 10 6
【样例输出】
1
【数据范围】
N ≤300000。
坐标绝对值均小于1000,且保证不会出现三点共线或重合的点。
【来源】
F.M.S in Changsha
Solution:
这题其实非常水,因为bigmingod在(0,0)所以只有当三个点所代表的向量的夹角都为锐角时才满足条件。
其实就是前两个叉乘同号,最后一个叉乘和前两个异号。
当然还有一种做法就是把每一个解析式求出来,再随表从(0,0)引一条射线,看射线和几个函数图像再两点之间相交,如果这个个数为 基数则说明点在区域内,否则不合法。但是本蒟蒻只打了60分,另外40不是精度问题就是随机选取的射线有问题,有可能出现重合现象。
1 #include<cstdio> 2 #define eps 1e-9 3 using namespace std; 4 double x1,y1,x2,y2,x3,y3; 5 double abs(double x) { 6 return x>0?x:(-x); 7 } 8 int n,ans; 9 int main() { 10 scanf("%d",&n); 11 while(n--) { 12 scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3); 13 if((x1==x2&&x2==x3)||(y1==y2&&y2==y3)) { 14 continue; 15 } 16 if((x1==x2&&!x2)||(x1==x3&&!x1)||(x2==x3&&!x3)) { 17 continue; 18 } 19 if((y1==y2&&abs(y1)<eps)||(y2==y3&&abs(y2)<eps)||(y1==y3&&abs(y3)<eps)) { 20 continue; 21 } 22 double ans1=x1*y2-y1*x2; 23 double ans2=x2*y3-y2*x3; 24 double ans3=x1*y3-y1*x3; 25 if(ans1>eps&&ans2>eps&&ans3<eps){ 26 ans++; 27 } 28 if(ans1<eps&&ans2<eps&&ans3>eps){ 29 ans++; 30 } 31 } 32 printf("%d\n",ans); 33 return 0; 34 }
cogs 1656. 膜拜神犇