2020 06-01
代码思路:
- 接收输入(点的数量和查询的数量),并统计 A 和 B 的数量。
- 对于每个点,输入坐标和字符,并根据字符统计 A 和 B 的数量。
- 进行 m 次查询。对于每个查询,输入 A、B 和 C 的值,并使用方程 C + Ax + By > 0 计算在直线上侧的点数,分别用 sum_A 和 sum_B 表示 A 类和 B 类的点数。如果存在一个 A 点位于直线上侧,所有 A 点都在直线上侧且没有 B 点在直线上侧,则该查询返回 Yes;否则,返回 No。
- 输出每个查询的结果。
注意:只需要统计一侧的结果即可,没必要同时统计两侧,尽量把问题简化
代码实现:
#include<iostream>
#include<string>
using namespace std;
struct node {
int x;
int y;
char z;
}node[1000]; // 定义坐标和字符
int main()
{
// 接收输入
int n;
cin >> n; // 点的数量
int m;
cin >> m; // 查询的数量
// 统计 A 和 B 的数量
int sumA = 0;
int sumB = 0;
for (int i = 0; i < n; i++)
{
cin >> node[i].x >> node[i].y >> node[i].z;
if (node[i].z == 'A')
sumA++;
else
sumB++;
}
// 进行查询并统计结果
int s = 0; // 用于存储每个查询的结果
string* ans = new string[m]; // 存储答案的数组
for (int a = 1; a <= m; a++) // 进行 m 次查询
{
int A, B, C;
cin >> C >> A >> B;
int sum_A = 0;
int sum_B = 0;
for (int i = 0; i < n; i++)
{
if (C + A * node[i].x + B * node[i].y > 0 && node[i].z == 'A') // 只统计上侧
sum_A++;
else if (C + A * node[i].x + B * node[i].y > 0 && node[i].z == 'B')
sum_B++;
}
if (sumA == sum_A && sum_B == 0 || sumB == sum_B && sum_A == 0) // 判断是否符合条件
ans[s] = "Yes";
else
ans[s] = "No";
s++;
}
// 输出结果
for (int i = 0; i < m; i++)
{
cout << ans[i] << endl;
}
}
运行结果: