题目
过程
第一次提交
运行结果错误,但是在dev c++中运行正确,暂未找到原因,记录一下。
#include<bits/stdc++.h>
using namespace std;
int n,m;
int X[110],Y[110];
char T[110];
string result[22];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>X[i]>>Y[i]>>T[i];
}
for(int i=1;i<=m;i++)
{
long long theta0,theta1,theta2;
cin>>theta0>>theta1>>theta2;
int pa=0,pb=0,p=0;
for(int j=1;j<=n;j++)
{
if(T[j]=='A')
{
//cout<<theta0+theta1*X[j]+theta2*Y[j]<<endl;
if(theta0+theta1*X[j]+theta2*Y[j]>=0)
{
if(pa==2)
{
//cout<<"No"<<endl;
result[i]="No";
p=1;
break;
}
pa=1;
}
else
{
if(pa==1)
{
//cout<<"No"<<endl;
result[i]="No";
p=1;
break;
}
pa=2;
}
}
else if(T[j]=='B')
{
if(theta0+theta1*X[j]+theta2*Y[j]>=0)
{
if(pb==2)
{
//cout<<"No"<<endl;
result[i]="No";
p=1;
break;
}
pb=1;
}
else
{
if(pb==1)
{
//cout<<"No"<<endl;
result[i]="No";
p=1;
break;
}
pa=2;
}
}
}
if(p==0)
//cout<<"Yes"<<endl;
result[i]="Yes";
}
for(int i=1;i<=m;i++)cout<<result[i]<<endl;
return 0;
}
第二次提交
把点坐标代入直线方程判断点再直线哪一侧。对于每一个直线方程,判断过程如下:
记录下每个点的信息,判断的时候先计算第一个点位于直线哪一侧,再看剩余的点是否和第一个点同类别:
- 如果同类别,那么该点应该和第一个点在直线同一边。若不是,返回false。
- 如果不同类别,那么该店应该和第一个点在不同侧。若不是,返回false。
输入样例:
9 3
1 1 A
1 0 A
1 -1 A
2 2 B
2 3 B
0 1 A
3 1 B
1 3 B
2 0 A
0 2 -3
-3 0 2
-3 1 1
#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
int n,m;
struct point{
int x,y;
char type;
}points[maxn];
long long theta0,theta1,theta2;
bool solve()
{
int i=0;
long long res=theta0+theta1*points[i].x+theta2*points[i].y;
for(int i=1;i<n;i++)
{
long long res1=theta0+theta1*points[i].x+theta2*points[i].y;
if(points[i].type==points[0].type)
{
if(res*res1<0)return false;
}
else{
if(res*res1>0)return false;
}
}
return true;
}
int main()
{
cin>>n>>m;
int x,y;
char type;
for(int i=0;i<n;i++)
{
cin>>points[i].x>>points[i].y>>points[i].type;
}
for(int i=0;i<m;i++)
{
cin>>theta0>>theta1>>theta2;
if(solve())
cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}