题目
测试数据
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 "iostream"
#include "cstdio"
using namespace std;
typedef long long ll ;
struct point{
ll x;
ll y;
}a[1005],b[1005];
ll n,m;
ll Tmp;
bool solve(ll n0,ll n1,ll n2,ll cnt ,ll cot){
bool flag;
ll f=0;
for (int i=1;i<=cnt-1;i++){
f= n0+n1*a[i].x+n2*a[i].y;
if(i==1){
Tmp=f;
continue;
}
if(f*Tmp<0){
return false ;
}
}
for (int i=1;i<=cot-1;i++){
f= n0+n1*b[i].x+n2*b[i].y;
if(f*Tmp>0){
return false;
}
}
return true;
}
int main(){
cin>>n>>m;
ll px,py,pt;
ll cnt=0;
ll cot=0;
for (int i=1;i<=n;i++){
scanf("%lld %lld %c",&px,&py,&pt);
if(pt=='A'){
cnt++;
a[cnt].x=px;
a[cnt].y=py;
}
else{
cot++;
b[cot].x=px;
b[cot].y=py;
}
}
ll n0,n1,n2;
bool any[1000]={false};
for (int i=1;i<=m;i++ ){
cin>>n0>>n1>>n2;
any[i]=solve(n0,n1,n2,cnt,cot);
}
for (int i=1;i<=m;i++){
if(any[i])
printf("Yes\n");
else
printf("No\n");
}
}
相关思路
这个逻辑是简单的,就是将点按照AB分成两组,然后随便选一组的第一个,然后开始对比,出现错误就溜,判断对则要确保你溜不掉。
这个程序真是调的我服了,我真的要吐了,我一度怀疑我是个傻子,怀疑我是不是逻辑错了。结果没有就是代码写的不熟练,调程序调少了,too young too simple ,之后多敲多积累吧。