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不是精度问题就是随机选取的射线有问题,有可能出现重合现象。用int,double会死一个点。

 1 #include<cstdio>
 2 #define eps 1e-10
 3 using namespace std;
 4 int x1,y1,x2,y2,x3,y3;
 5 int n,ans;
 6 int main(){
 7     freopen("trioxorz.in","r",stdin);
 8     freopen("trioxorz.out","w",stdout);
 9     scanf("%d",&n);
10     while(n--) {
11         scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3);
12         int ans1=x1*y2-y1*x2;
13         int ans2=x2*y3-y2*x3;
14         int ans3=x1*y3-y1*x3;
15         if(ans1>0&&ans2>0&&ans3<0){
16             ans++;
17         }else{
18             if(ans1<0&&ans2<0&&ans3>0){
19                 ans++;
20             }
21         }
22     }
23     printf("%d\n",ans);
24     return 0;
25 }

 

 

posted @ 2017-08-05 21:16  Forever_goodboy  阅读(305)  评论(2编辑  收藏  举报