图片说明
哈哈,我又来了!同样,我们先来分析题目,这里我要说一点,大家做这种比赛的题目第一步就是要先审清题目,很多人一看到题目提交的人数很少或是为了抢时间,就匆匆扫了一眼题目,然后就动手,这样是很不好的习惯。笔者看来,对于一道题目,审题往往是要去花心思的,我们要看清题目讲的是什么,输入格式,输出格式等等,不要太心慌,沉着冷静,特别是这种acm赛制,一旦提交结果错误,就罚时20分钟,这是得不偿失的。而且,别人不会也不是代表自己不会。言归正传,题目的意思就是给出n个点的坐标,然后求这n个点中组成的三角形中是钝角三角形的个数。
很容易想到,首先对n个点进行枚举,然后逐个判断某三个点组成的三角形是否为钝角,但是,这里就有一个问题,给出三个点的坐标,我们怎么判断它是否为钝角三角形呢?其实,这要是在你高三那段时间出个这个题目给你,你可能很快就会做。其实它是可以用向量的点乘判断。例如:两个向量a,b,其夹角的大概大小就可以用点乘判断,通过判断a,b向量点乘的符号来判断。所以我们现在的目的就是把点转化为向量,emmm,这些都是高中的知识,我在这里就不细讲了。
现在,我就来给出相关代码及其含义:

bool judge(int a,int b,int c){
    int res1=x[b]-x[a];
    int res2=y[b]-y[a];
    int res3=x[c]-x[a];
    int res4=y[c]-y[a];
    if(((res1*res3+res2*res4)<0)&&(res1*res4)!=(res3*res2))  return true;
    else return false;
}

我在这里定义了一个函数直接来判断这三个点是否可以组成一个钝角三角形。这里a,b,c都是点的下标,我们姑且称之为a,b,c三个点。如x[a],y[a],就代表的是a的x,y坐标。显然,(res1,res2)组成了一个向量,(res3,res4)又组成了一个向量。这两个向量的夹角为a点对应的角。但是,这里要注意的是共线问题,我们可以让两个向量的x,y交叉相乘来判断,即res1与res4的乘积与res3与res2的乘积是否相等来判断是否共线。这个具体的还要请大家看完整的代码才能更好理解,放心,代码我给了解释。
接下来,我就给出源码了哈

#include<iostream>
using namespace std;
int x[520],y[520];  //注意我们这里把它定义成了全局变量,好进行参数传递
bool judge(int a,int b,int c);
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>x[i]>>y[i];
    }
    int ans=0;
//对n个点进行枚举
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            for(int k=j+1;k<n;k++){
//分别把3个点当作函数第一个参数进行传递,第一个参数返回的结果代表的是对应点是否为钝角
                if(judge(i,j,k)||judge(j,i,k)||judge(k,i,j))  ans++;
            }
        }
    }
    cout<<ans;
    return 0;
}
bool judge(int a,int b,int c){
    int res1=x[b]-x[a];
    int res2=y[b]-y[a];
    int res3=x[c]-x[a];
    int res4=y[c]-y[a];
    if(((res1*res3+res2*res4)<0)&&(res1*res4)!=(res3*res2))  return true;
//注意这里要同时满足
    else return false;
}

好了,本题就这样了,还有问题请下方留言。