题目
题目可以在CSP官网中查看到哟!
算法思想
题目大意是:判断type=A的所有点是否在直线的同一侧并且type=B的所有点是否在该直线的另一侧。我们要做的就是在读入m个直线的时候就开始判断。当读入一个直线的时候,我们遍历所有n个点,我们首先用flagA和flagB标记是否出现过type=A或type=B的点,如果没有出现,则用ansA和ansB记录此时type=A或type=B的点在直线的哪一侧;如果出现了,则判断当前这个点在直线的一侧是否与之前记录的一侧是否一致,如果一致,则继续判断,如果不一致,则直接输出No,跳出循环,进行下一个直线的判断。
完整代码
#include<iostream>
#include<cstdio>
using namespace std;
int n, m;
int x[1005], y[1005];
char type[1005];
int main()
{
int i, j;
cin >> n >> m;
for (i = 1; i <= n; i++)
cin >> x[i] >> y[i] >> type[i];
int t0, t1, t2;
for (i = 1; i <= m; i++)
{
int flag = 0;
int flagA = 0, flagB = 0;
int ansA = -1, ansB = -1;
cin >> t0 >> t1 >> t2;
for (j = 1; j <= n; j++)
{
if (type[j] == 'A')
{
if (flagA == 0)
{
ansA = ((t0 + t1 * x[j] + t2 * y[j]) > 0);
flagA = 1;
}
else if (flagA == 1)
{
if (ansA != ((t0 + t1 * x[j] + t2 * y[j]) > 0))
{
flag = 1;
cout << "No" << endl;
break;
}
}
}
else if (type[j] == 'B')
{
if (flagB == 0)
{
ansB = ((t0 + t1 * x[j] + t2 * y[j]) > 0);
flagB = 1;
}
else if (flagB == 1)
{
if (ansB != ((t0 + t1 * x[j] + t2 * y[j]) > 0))
{
flag = 1;
cout << "No" << endl;
break;
}
}
}
}
if(flag == 0)
cout << "Yes" << endl;
}
return 0;
}