思路比较简单
ax+by+c=0 可将点分为 ax+by+c<0 和 ax+by+c>0 两类点。
利用此特征开始解题
#include <iostream>
#define N 1001
#define M 21
using namespace std;
typedef struct point
{
int x;
int y;
char type;
}point; //记录点的坐标(x,y),以及其点类型
typedef struct fxy
{
long long int a;
long long int b;
long long int c;
}fxy; //记录线性函数的三个参数
point dian[N];
fxy f[M];
int n,m;
int judgeP (long long int *a, int len) //判断数组中数据是否均大于0 (P-positive)
{
int j,sum=1,flag=0;
for (j=1; j<=len; j++)
if (a[j]>0) sum++;
if (sum==len) flag=1;
else flag=0;
return flag;
}
int judgeN (long long int *a, int len) //判断数组中数据是否均小于0 (N-negative)
{
int j,sum=1,flag=0;
for (j=1; j<=len; j++)
if (a[j]<0) sum++;
if (sum==len) flag=1;
else flag=0;
return flag;
}
int answer (point* a, fxy* b, int i) //分类A,B点
{
int j,l=1,p=1,flag=0,flag1,flag2,flag3,flag4; //flag1~4用于记录判断结果
long long int A[N]={0}, B[N]={0};
for (j=1; j<=n; j++)
{
if (a[j].type=='A') //若定义为A类点,则将其线性函数值存于A数组中
{
A[l]=b[i].a+b[i].b*a[j].x+b[i].c*a[j].y;
l++;
}
if (a[j].type=='B') //若定义为B类点,则将其线性函数值存于B数组中
{
B[p]=b[i].a+b[i].b*a[j].x+b[i].c*a[j].y;
p++;
}
}
flag1=judgeP(A,l); flag2=judgeP(B,p);
flag3=judgeN(A,l); flag4=judgeN(B,p);
if ((flag1 && flag4) || (flag2 && flag3)) //A为正,B就为负 || A为负,B就为正
flag=1;
else flag=0;
return flag;
}
int main(int argc, char** argv) {
cin>>n>>m;
int i,j;
for (i=1; i<=n; i++)
{
cin>>dian[i].x>>dian[i].y;
cin>>dian[i].type;
} //输入点的信息
for (j=1; j<=m; j++)
{
cin>>f[j].a>>f[j].b>>f[j].c;
} //输入参数信息
for (i=1; i<=m; i++)
if (answer(dian,f,i)==1)
cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
虽然是第一题,但也花了不少时间(因为菜得没法)。总体来说,还是比较清楚思路的。