poj 2002 列舉 雜湊

2021-08-20 02:12:52 字數 1509 閱讀 5783

給定n個點,求出這些點一共可以構成多少個正方形。

sample input

4

1 00 1

1 10 0

90 0

1 02 0

0 21 2

2 20 1

1 12 1

4-2 5

3 70 0

5 20

sample output

1

61

可列方程:

可以得出  ;知道兩點求出其餘兩點

x3 = node[i].x + (node[i].y - node[j].y); 

y3 = node[i].y + (node[j].x - node[i].x); 

和 x4 = node[j].x + (node[i].y - node[j].y); 

y4 = node[j].y + (node[j].x - node[i].x); 

或者

x3 = node[i].x - (node[i].y - node[j].y);
y3 = node[i].y + (node[i].x - node[j].x);
x4 = node[j].x - (node[i].y - node[j].y);
y4 = node[j].y + (node[i].x - node[j].x);
然後列舉兩點就行

利用雜湊表;

**:

#include#include#include#includeusing namespace std;

const int mul = 27;

const int mod = 5013;

int nexts[5025], last[5025];

struct point node[5025];

bool m_z(int va, int x, int y)

pre = nexts[pre];

} return false;

}int main()

for(int i=0;ifor (int j = i + 1; j < n; j++)

x3 = node[i].x - (node[i].y - node[j].y);

y3 = node[i].y + (node[i].x - node[j].x);

x4 = node[j].x - (node[i].y - node[j].y);

y4 = node[j].y + (node[i].x - node[j].x);

if (m_z((((x3*mul + y3) % mod + mod) % mod), x3, y3) && m_z((((x4*mul + y4) % mod + mod) % mod), x4, y4))

}cout << ans/4 << endl;

} return 0;

}

POJ 1018 列舉 貪心

題意 有n件商品,每件商品有m個製造商,每個製造商製造的商品有不同的 頻寬和 每件商品必須選乙個製造商,最後的頻寬是所有頻寬中的最小值,價值是所有商品的總 目的是使b p最大,輸出最大的b p的值。思路 由於資料範圍比較小,所以可以列舉。可以求出所有製造商的商品的最大頻寬和最小頻寬,然後列舉在兩者之...

poj1873 列舉 凸包

題意 平面上有n棵樹,現在要砍掉其中的一部分來做成籬笆將剩下的樹包圍起來,現在給出每棵樹的座標 價值和可以製造籬笆的長度,求砍掉最少價值的樹,將剩下的樹包圍起來,當兩種方式的價值相同時,取砍掉樹更少的方式。由於樹棵樹不大於15,可以二進位制列舉情況,求出其它樹構成的凸包的周長即可 include i...

POJ 2699 列舉 最大流

這應該說是比較神的乙個題目了 題意的話,就是有n 個人,兩兩之間打比賽,每場比賽贏的人加一分,總共呢有n n 1 2個比賽,然後求這樣一種人的個數,就是能贏所有比自己分高的人或者他就是分最高的人。當然我們是求這種人可能的最大個數,建圖的話,就要分兩種點,人和比賽,很顯然,源點到所有的人建邊,容量是該...