轟炸【共線問題/枚舉】

“我該怎麼辦?”飛行員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;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章