CCF 线性分类器
这道题我是真没想到,原来数据类型错了都可能一分没有,一直提及是0分(我把所有的数据类型都设置成了int型)然后我把int改成了long long int型就满分通过,我哭了啊。
这道题直接使用最简单的方法,将所有的点读入以后,对所有的输入的线,直接带点进去,以第一个点为依据(它说了左右两边点的个数肯定都大于0),如果第k点与第1个点在同一边并且类型不同或者两个点不在同一边结果类型相同的话都直接输出No,否则判断完所有都满足条件的话就输出Yes就行。
代码如下:(一定要注意数据类型呀)
#include<iostream>
using namespace std;
struct a{
int x;
int y;
char type ;
};
int main(){
int n,m;
cin>>n>>m;
a node[n];
for(int i=0;i<n;i++){
cin>>node[i].x>>node[i].y>>node[i].type;
}
//开始读入直线并进行处理
for(int j=0;j<m;j++){
int x1,y1,k;
cin>>k>>x1>>y1;
long long int h=x1*node[0].x+y1*node[0].y+k;
int i;
bool flag=true;
for(i=1;i<n;i++){
long long int h1=x1*node[i].x+y1*node[i].y+k;
if(h1*h>0&&node[i].type==node[0].type||h1*h<=0&&node[i].type!=node[0].type);
else flag=false;
}
if(flag==true) cout<<"Yes"<<endl;
else cout<<"No"<<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