关于多边形内点数问题的一些变形
最近兩次比賽出現(xiàn)兩道相同類型的題,有人十幾分鐘就AC了,而有人卡了倆小時(shí)。。。反思。。
?
?先說hdu4353這道題,題意是要求一個(gè)從N個(gè)點(diǎn)1里邊畫出一個(gè)多邊形來,然后給出M個(gè)點(diǎn)2。讓這個(gè)(多邊形的面積/多邊形內(nèi)點(diǎn)2的個(gè)數(shù))最小。
?描述很復(fù)雜。。。但是仔細(xì)想想會(huì)發(fā)現(xiàn),多邊形的點(diǎn)越多,面積也就越大,所以,這里只能畫三個(gè)點(diǎn),也就是一個(gè)三角形。至于怎么求點(diǎn)2的個(gè)數(shù),這是很有必要總結(jié)的,祭奠我那苦逼的倆小時(shí)吧。。。。
先看一個(gè)圖:?
這不是立體圖,僅僅是個(gè)平面圖。。。
假設(shè)sum[i][j]表示i,j這條線上方這塊區(qū)域的點(diǎn)的數(shù)目
可以看到三角形內(nèi)點(diǎn)2的數(shù)目 = sum[i][j] + sum[j][k] - sum[i][k];
其實(shí)更通用一點(diǎn)就是: abs(sum[i][k] - sum[i][j] - sum[j][k]);
既然統(tǒng)計(jì)出這些點(diǎn)數(shù)來,這個(gè)問題基本就解決了。
?HDU 4353的代碼:
View Code const int N = 210; const int M = 511;struct Point {int x, y;bool operator < (const Point& cmp) const {return x < cmp.x;} };Point a[N], b[M]; int sum[N][N]; int n, m;inline int det(int x1, int y1, int x2, int y2) {return x1*y2 - x2*y1; }inline int cross(Point a, Point b, Point c) {return det(b.x - a.x, b.y - a.y, c.x - a.x, c.y - a.y); }int main() {//freopen("data.in", "r", stdin);int i, j, k, t, cas = 0, cnt;double ans, area;scanf("%d", &t);while(t--) {scanf("%d%d", &n, &m);REP(i, n) scanf("%d%d", &a[i].x, &a[i].y);REP(i, m) scanf("%d%d", &b[i].x, &b[i].y);sort(a, a + n);for(i = 0; i < n; ++i) {for(j = i + 1; j < n; ++j) {sum[i][j] = 0;for(k = 0; k < m; ++k) {if(b[k].x >= a[i].x && b[k].x < a[j].x) {if(cross(a[i], a[j], b[k]) > 0) sum[i][j]++;}}}}ans = -1;for(i = 0; i < n; ++i) {for(j = i + 1; j < n; ++j) {for(k = j + 1; k < n; ++k) {cnt = sum[i][k] - sum[i][j] - sum[j][k];if(cnt == 0) continue;area = double(cross(a[i], a[j], a[k]))/2;if(ans == -1 || fabs(area/cnt) < ans) ans = fabs(area/cnt);}}}if(ans == -1) printf("Case #%d: -1\n", ++cas);else printf("Case #%d: %.6lf\n", ++cas, ans);}return 0; }?
? 還有一個(gè)就是多校9上的1001題(HDU 4380)。比上面這個(gè)題更直白,需要統(tǒng)計(jì)三角形內(nèi)的點(diǎn)數(shù)是不是奇數(shù)就可以。。。
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/vongang/archive/2012/08/22/2650887.html
總結(jié)
以上是生活随笔為你收集整理的关于多边形内点数问题的一些变形的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《101 Windows Phone 7
- 下一篇: Wijmo 更优美的jQuery UI部