“我該怎麼辦?”飛行員klux向你求助。 事實上,klux面對的是一個很簡單的問題,但是他實在太菜了。 klux要想轟炸某個區域內的一些地方,它們是位於平面上的一些點,但是(顯然地)klux遇到了抵抗,所以klux只能飛一次,而且由於飛機比較破,一點起飛就只能沿直線飛行,無法轉彎。現在他想一次轟炸最多的地方。 不限定起飛地點
這道題,我們顯然需要知道二維空間內所有直線上的點的數目,取其中最大的,但是直線是連續的,所以這也算是離散化吧,我們取任意兩個點來組成一條直線,然後依次判斷每個點是否在這個直線上。判斷點在直線上的方法即向量內積爲0,
其中x,y是兩點確定的直線的向量。
ll tx = a[k].x - a[i].x, ty = a[k].y - a[i].y;
if (tx*y - ty * x == 0)cnt++;
#define MAX 1005
#define inf 0x3fffff
#define ll int
#define vec vector<ll>
#define PA pair<ll,ll>
struct P {
ll x, y;
}a[MAX];
int main() {
ll n;
while (cin >> n) {
ll res = 0, cnt = 0;
for (int i = 0; i < n; i++)
cin >> a[i].x >> a[i].y;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
//兩點確定一條直線
cnt = 2;
ll x = a[i].x - a[j].x, y = a[i].y - a[j].y;
for (int k = 0; k < n; k++) {
if (k == i || k == j)continue;
ll tx = a[k].x - a[i].x, ty = a[k].y - a[i].y;
if (tx*y - ty * x == 0)cnt++;
}
if (cnt > res)res = cnt;
}
}
cout << res << endl;
}
}