这题妾身先想的是怎么判段点在那一侧,仔细想了一下,发现只要将点的坐标代入直线表达式,判断结果是大于还是小于0,就是点在直线的左侧(上侧)还是右侧(下侧)。
那么接下来就是看A类点在全部为直线左侧的同时,判断B类点是否全部在右侧,反之亦然。
诶呀,由于小女子实在是太笨了,想不到好办法。只能采用最笨的方法就是统计A类点在左侧的个数和右侧的个数,看看哪一侧等于A类点的总个数,同时判断B类点在另一侧是否也等于B类点的总个数。
上代码!哈哈^_^
#include<iostream>
#include<string>
using namespace std;
//点结构体
struct point
{
int x;
int y;
char type;
}p[1001];
int main()
{
int n, m;
cin >> n >> m;
int i, j;
int a, b, c;
for (j = 0; j < n; j++)
{
cin >> p[j].x >> p[j].y >> p[j].type;
}
for (i = 0; i < m; i++)
{
cin >> a >> b >> c;
int sumA = 0, sumB = 0, sumA1 = 0, sumA2 = 0, sumB1 = 0, sumB2 = 0;
for (j = 0; j < n; j++)
{
int sum = a + b * p[j].x + c * p[j].y;
if (p[j].type == 'A')
{
sumA++;
if (sum > 0)
{
sumA1++;
}
else
{
sumA2++;
}
}
else
{
sumB++;
if (sum > 0)
{
sumB1++;
}
else
{
sumB2++;
}
}
}
if ((sumA == sumA1 && sumB == sumB2) || (sumA == sumA2 && sumB == sumB1))
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}
system("pause");
return 0;
}
其实妾身也查看了别人的方法,就是将第一个点作为基准,看看同类点是否依旧同样大于或者小于0,可是妾身写了,感觉应该没错,但是在csp模拟考试中提交只得了60分,然后始终找不到错误,只好放弃了,也就没有贴上这个代码,以后有机会一定会重新试试看。小女子会加油的!