ABC-E K-clinear Line
座標平面上の N 個の点が与えられます。 1≤i≤N について、i 番目の点の座標は (X i ,Y i ) です。
座標平面上の直線であって、N 個の点のうち K 個以上の点を通るものの個数を求めてください。 ただし、そのようなものが無数に存在する場合は Infinity を出力してください。
3点をとって2本のベクトルを比較するO(N3)はpythonだと無理だと思ったので、辞書を使う方法を検討。間に合わなく反省のために後日再トライ。 ポイントはy軸に衝突刷る切片に有理数で傾きを持つ事と、傾きがゼロのときの枠を用意する事。 小数だと辞書が安定せずWAしたので、1000倍した整数に変更、面倒くさい。
N,K=acinput() x=[] for i in range(N): x.append(acinput()) x=sorted(x) from fractions import Fraction y=defaultdict(int) for i in range(N-1): for j in range(i+1,N): v=np.array(x[j])-x[i] v=list(v) if v[0]==0: y[("inf",x[i][0],"inf")]+=1 else: k=-x[i][0]/v[0] a=x[i][1]+v[1]*k ff=Fraction(v[1],v[0]) a=str(a*1000) y[(a[:3],0,ff.numerator,ff.denominator)]+=1 #print(x[i],x[j],v,a,ff) res=0 for k in y: n=y[k] if K*(K-1)/2<=n: res+=1 if K==1: print("Infinity") else: print(res)