【Python】CCF计算机软件能力认证试题练习:202006-1 <线性分类器> 小题但是坑蛮多的
原题目


解题思路
三个参数确定一条直线的一般式方程
遍历每个点,将点坐标带入方程中,如果大于0,那么在一侧,如果小于0,在另一侧
- 记录大于0的点的类型,如果在后面的遍历中遇到大于0的点且类型不同的话,那么就输出"No"
- 记录小于0的点的类型,如果在后面的遍历中遇到小于0的点且类型不同的话,那么就输出"No"
如果遍历没有break,那么就输出"Yes"
遇到的坑和陷阱
- 第一次做这个题时,不太清楚是不是一般式的结果和0比较是不是能区分点在两侧,所以使用了截距式,y=kx+b,这样就需要考虑k是否为0的情况
- 之后想利用在直线一侧点的数量与类型A或者B的数量比较,如果相等,那么就输出"Yes",否则输出"No",这个没有考虑一侧混合有A类型和B类型的点,且数量恰好和类型A的总数相等的情况,过了80%的数据
- 之后在实现的时候只用上侧的点,这样有时会出现所有的点都在另一侧,也会出现上侧的点都是A类型,但是下侧的点既有A类型又有B类型,也算是一个坑
- 再然后是break结束循环的位置问题,需要注意不要重复输出,可以利用for循环加上else语句,如果循环没有被break结束,才执行else块中的语句
Python源代码
n,m=map(int,input().split())
points=[]
for i in range(n):
x,y,t=input().split()
points.append([int(x),int(y),t])
request=[]
for i in range(m):
a,b,c=map(int,input().split())
request.append([a,b,c])
for i in range(m):
a,b,c=request[i]
up=None
down=None
for j in range(n):
if(a+b*points[j][0]+c*points[j][1]>0):
if(up==None):
up=points[j][2]
else:
if(up!=points[j][2]):
print("No")
break
else:
if(down==None):
down=points[j][2]
else:
if (down != points[j][2]):
print("No")
break
else:
print("Yes")

浙公网安备 33010602011771号