作者:its_ycm
来源:优快云
原文:https://blog.csdn.net/its_ycm/article/details/110004491
版权声明:本文为博主原创文章,转载请附上博文链接!
问题描述
试题编号: 202006-1
试题名称: 线性分类器
时间限制: 1.0s
内存限制: 512.0MB
样例输入
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;
struct node{
int x,y,s;
char ch;
}nod[1000];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;++i){
cin>>nod[i].x>>nod[i].y>>nod[i].ch;
}
int a,b,c,f;
for(int j=0;j<m;++j){
cin>>a>>b>>c;
for(int i=0;i<n;++i){
nod[i].s = (a+b*nod[i].x+c*nod[i].y)>0?-1:1;
if(i!=0){
if((nod[i].ch==nod[0].ch)&&(nod[i].s*nod[0].s)>0)
f = 1;
else if((nod[i].ch!=nod[0].ch)&&(nod[i].s*nod[0].s)<0)
f = 1;
else{
f = 0;
break;
}
}
}
if(f)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}
大数相乘注意取值范围!!!!!下面的代码把代入直线方程后的结果保存到s了。所以要用long long型。
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y;
long long s;//!!!!!!!!!!!!!!!
char ch;
}nod[1000];
int f[20];
int main()
{
int n,m,a,b,c;
cin>>n>>m;
for(int i=0;i<n;++i)
cin>>nod[i].x>>nod[i].y>>nod[i].ch;
for(int j=0;j<m;++j){
cin>>a>>b>>c;
for(int i=0;i<n;++i){
nod[i].s = a + b*nod[i].x + c*nod[i].y;
if(i!=0){
if( (nod[i].ch==nod[0].ch) && ((nod[i].s*nod[0].s)>0) )
f[j]=1;
else if( (nod[i].ch!=nod[0].ch) && ((nod[i].s*nod[0].s)<0) )
f[j]=1;
else{
f[j]=-1;
break;
}
}
}
}
for(int i=0;i<m;++i){
if(f[i]==1)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}