202006 ccf模拟
1.线性分类器
#include <bits/stdc++.h>
using namespace std;
struct point{
int x;
int y;
char c;
}p[1005];
int main()
{
int n,m,i,j,a,b,c,flag;
cin>>n>>m;
int result,pri[25];
for(i=0;i<n;i++)
cin>>p[i].x>>p[i].y>>p[i].c;
for(i=0;i<m;i++)
{
cin>>a>>b>>c;
pri[i]=1;
flag=1;
for(j=0;j<n;j++)
{
result=a+b*p[j].x+c*p[j].y;
if(j==0)
{
if(result<0&&p[j].c=='A')
flag=0;
else if(result>0&&p[j].c=='B')
flag=0;
}
if(flag==0)
{
if(p[j].c=='A'&&result>0)
{
pri[i]=0;
break;
}
else if(p[j].c=='B'&&result<0)
{
pri[i]=0;
break;
}
}
else
{
if(p[j].c=='A'&&result<0)
{
pri[i]=0;
break;
}
else if(p[j].c=='B'&&result>0)
{
pri[i]=0;
break;
}
}
}
}
for(i=0;i<m;i++)
{
if(pri[i]==0)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
return 0;
}
注意:示例给的是A位于分界线下端,但是A可能位于分界线的上端,使用flag标记A在分界线的哪端。
2.稀疏向量
#include <bits/stdc++.h>
using namespace std;
struct point{
int index;
int value;
}upoint[500005],vpoint[500005];
int main()
{
int n,a,b;
int i,up=0,vp=0;
long long sum=0;
cin>>n>>a>>b;
for(i=0;i<a;i++)
cin>>upoint[i].index>>upoint[i].value;
for(i=0;i<b;i++)
cin>>vpoint[i].index>>vpoint[i].value;
while(up<a&&vp<b)
{
if(upoint[up].index==vpoint[vp].index)
{
sum+=upoint[up].value*vpoint[vp].value;
up++;
vp++;
}
else if(upoint[up].index<vpoint[vp].index)
up++;
else
vp++;
}
cout<<sum;
return 0;
}
注意:用一层while循环代替了两层for循环,利用index的有序性