【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")
posted @ 2020-09-12 19:01  阿杰也请你吃颗糖  阅读(231)  评论(0)    收藏  举报