该题是第一题,相当于打卡题,比较简单,我在代码中的备注也很清楚。
该题主要考察的就是怎么判断一个点和直线的关系,该题就是点在直线的下面还是上面(题中说了不可能刚好点在直线上)直线:ax+by+k=0;判断点(x0,y0),把(x0,y0)带入ax+by+k=sum,判断sum的正负,如果所有点的sum都>0或者小于0就说明在一侧,先判断A的sum,如果sum>0那么B应该是sum<0,反之如此,这样才是合法的。
下面是代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
vector<pair<int,int>> A;
vector<pair<int,int>> B;
for(int i=0;i<n;++i)
{
int temp1,temp2;
char type;
cin>>temp1>>temp2>>type;
if(type=='A')//选择压入哪一个容器
A.push_back(make_pair(temp1,temp2));
else if(type=='B')
B.push_back(make_pair(temp1,temp2));
}
for(int i=0;i<m;++i)
{
int k,a,b;//k+ax+by=0
cin>>k>>a>>b;
bool flag=false;// -
//A
long long temp=a*A[0].first+b*A[0].second+k;//查看第一个的值的正负,判断在直线上面还是下面,后面的如果不同,就说明没有完全划分好A B
if(temp>0)
flag=true;
bool is_legal=true; //判断A中是否都在直线的一侧
for(int j=1;j<A.size();++j)
{
long long sum=a*A[j].first+b*A[j].second+k;
if((sum >0 && !flag )||(sum<0 && flag))//如果和第一项不在同一侧,说明不合法
{
is_legal=false;
break;
}
}
if(is_legal==false)
{
cout<<"No"<<endl;
continue;
}
//B
long long tempB=a*B[0].first+b*B[0].second+k;//查看B的第一项在直线的哪里
flag=!flag;//与A相反 + false
bool is_legal2=true;
for(int j=1;j<B.size();++j)
{
long long sum=a*B[j].first+b*B[j].second+k;//如果和第一项不在同一侧,说明不合法
if((sum >0 && !flag) || (sum<0 && flag))
{
is_legal2=false;
break;
}
}
if(is_legal2==false)
{
cout<<"No"<<endl;
continue;
}//最后就是正确的直线
cout<<"Yes"<<endl;
}
}
下面是截图: