csp认证2019题目1——线性分类器
题目没啥好说的,关键是注意一下int是否会溢出,坑了我好久。
#include <iostream>
#include <vector>
#include <queue>
#include <string.h>
using namespace std;
struct pt{
int x;
int y;
pt(int x_,int y_){
x = x_;
y = y_;
}
};
int main() {
int n,m;
vector<pt> A,B;
int t0[25],t1[25],t2[25];
memset(t0, 0, sizeof(t0));
memset(t1, 0, sizeof(t1));
memset(t2, 0, sizeof(t2));
cin>>n>>m;
while(n--){
int x,y;
char type;
cin>>x>>y>>type;
if(type=='A'){
A.push_back(pt(x,y));
}else{
B.push_back(pt(x,y));
}
}
for(int i = 0;i < m;i++){
cin>>t0[i]>>t1[i]>>t2[i];
}
for(int k = 0;k < m;k++){
bool flg = false;
//这里是关键的步骤,处理一下,不然很容易溢出
int Asign = t0[k]+t1[k]*A[0].x+t2[k]*A[0].y>0?1:-1;
int Bsign = t0[k]+t1[k]*B[0].x+t2[k]*B[0].y>0?1:-1;
if(Asign*Bsign > 0){
cout<<"No"<<endl;
continue;
}
for(int i = 0;i < A.size();i++) {
if((t0[k]+t1[k]*A[i].x+t2[k]*A[i].y)*Asign<0){
flg = true;
cout<<"No"<<endl;
break;
}
}
if(flg) continue;
for(int i = 0;i < B.size();i++) {
if((t0[k]+t1[k]*B[i].x+t2[k]*B[i].y)*Bsign<0){
flg = true;
cout<<"No"<<endl;
break;
}
}
if(flg) continue;
cout<<"Yes"<<endl;
}
return 0;
}
/*
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
*/
/*
No
No
Yes
*/
1.575KB 15ms